sql server随机获取表记录sql语句

sqlserver随机取记录方法只要用newid()即可

sqlserver已经有自带的一个newid()函数,它返回的是一个GUID,因此我们可以获取表记录时按这个newid()进行排序,因为newid()的结果是每次都不一样的,所以这样子查询的结果保证了每次排序的结果均是不一样的,以下以Northwind库中的orders表为例写一下获取10条随机记录:

语法

 代码如下 复制代码

select TOP N * From TABLE Order By NewID()

SELECT TOP 10 * FROM Northwind.Orders ORDER BY NEWID()

NewID()函数将创建一个 uniqueidentifier 类型的唯一值。

执行了几次感觉上符合要求,每次出来的都不一样。至于值域分布没深究,随机函数本身也是伪随机的。
做了个简单的测试

 代码如下 复制代码

CREATE TABLE #t(cname char(50) ,sysid uniqueidentifier)

DECLARE @i int

set @i = 0

WHILE (@i) < 1760
BEGIN
    INSERT INTO #t select top 1 cname,sysid from tVIPMember  order by newid()
    SET  @i = @i + 1
END

select count(*) from
 (select cname as a from #t group by cname,sysid ) a

库里一共是1760条记录,执行了几次结果在 1100 -1200 左右。

但是上面方法如果过万记录你会发现很慢哦,我们再接着来优化newid()

 代码如下 复制代码
CREATE DEFINER=`root`@`%` PROCEDURE `rand_data`(IN `tbName` VARCHAR(50), IN `rowCnt` INT, IN `tbKey` VARCHAR(50))
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT '随机获取若干记录,只适用于单主键表'
BEGIN
 
    #获取主键名
    IF tbKey IS NOT NULL THEN
        SET @tbKey=tbKey;#参数里面已经有,这种情况比较快
    ELSE
        #参数里面没,从系统表查找主键,比较耗时
        SELECT @tbKey:=c.COLUMN_NAME
        FROM
            INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS t,
            INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS c
        WHERE
            t.TABLE_NAME = c.TABLE_NAME
            AND t.TABLE_SCHEMA = c.TABLE_SCHEMA
            AND t.TABLE_SCHEMA = database()
            AND t.TABLE_NAME = tbName
            AND t.CONSTRAINT_TYPE = 'PRIMARY KEY';
    END IF;
         
    #获取最大id,最小id和记录数
    SET @getMaxIdSql = CONCAT('SELECT @maxId:=MAX(', @tbKey, '),',
        '@minId:=MIN(', @tbKey, '),',
        '@totalCnt:=COUNT(', @tbKey, ')',
        ' FROM `', tbName, '`;');
    PREPARE getMaxId FROM @getMaxIdSql;
    EXECUTE getMaxId;
    DEALLOCATE PREPARE getMaxId;
     
    #创建临时表
    DROP TABLE IF EXISTS rand_tt;
    SET @temTbSql = CONCAT('CREATE TEMPORARY TABLE rand_tt SELECT 0 aid,tb.* FROM `',tbName,'` tb LIMIT 0;');
    PREPARE temTb FROM @temTbSql;
    EXECUTE temTb;
    DEALLOCATE PREPARE temTb;
     
    #构建获取一条记录的sql
    SET @randRowSql = CONCAT('INSERT INTO rand_tt SELECT @cnt:=@cnt+1 aid,tb.* FROM ',
        tbName, ' tb WHERE tb.', @tbKey, '=?;');
    PREPARE addRow FROM @randRowSql;
     
    #生成随机记录
    SET @cnt=0;
    insertLoop: LOOP
        SET @id=FLOOR(RAND()*(@maxId-@minId)+@minId);
        IF NOT EXISTS (SELECT id FROM rand_tt WHERE id=@id) THEN
            EXECUTE addRow USING @id;
            IF @cnt >= rowCnt OR @cnt >= @totalCnt THEN
                LEAVE insertLoop;
            END IF;
        END IF;
    END LOOP insertLoop;    
    DEALLOCATE PREPARE addRow;
     
    #返回数据
    ALTER TABLE rand_tt DROP COLUMN aid;
    SELECT * FROM rand_tt;

END这样我再执行你会发现100W数据只要0.几步即可解决哦。

时间: 2024-09-16 01:08:40

sql server随机获取表记录sql语句的相关文章

SQL SERVER 2005 获取表的所有索引信息以及删除和新建语句

原文:SQL SERVER 2005 获取表的所有索引信息以及删除和新建语句 BEGIN WITH tx AS ( SELECT a.object_id ,b.name AS schema_name ,a.name AS table_name ,c.name as ix_name ,c.is_unique AS ix_unique ,c.type_desc AS ix_type_desc ,d.index_column_id ,d.is_included_column ,e.name AS co

sqlserver-关于SQL SERVER如何获取执行过的语句

问题描述 关于SQL SERVER如何获取执行过的语句 我知道sqldiag和sql server profiler好像是可以获取SQL SERVER执行过的语句的,版本为2005,但是前者在试验时,未能在相关trc文件获取历史语句,后者倒是能在监视器获取到,但由于鄙人是单独下载的,有点问题,不能保存结果到表或者文件(蛋疼),但是profiler不知道是不是可以自动生成可分析的trc文件?或者能自动保存啥的?小弟需要隔一段时间自动进行一次规则过滤分析,所以不能采用手动保存.坐等专家解答..十万火

SQL Server中删除重复记录的SQL语句

方法:  代码如下 复制代码            select distinct * into #tmp from tablename  drop table tablename  select * into tablename from #tmp drop table # tmp 常有时候遇到需要删除SQL Server中的重复记录,这里有一些常用的删除重复记录的SQL, 最常用的 T-SQL 语句:  代码如下 复制代码 DELETE FROM [dbo].[myTable] WHERE

数据存储-sql server在同一表中筛选出两次刷卡记录时间大于等于40分钟的员工数据

问题描述 sql server在同一表中筛选出两次刷卡记录时间大于等于40分钟的员工数据 刷卡进出数据存储在同一表中,姓名有重复的,一个人可能刷了2次,要求选出在时间段2014-12-28 11:00:00到2014-12-28 13:00:00内两次刷卡记录时间间隔大于等于40分钟的员工 logtime (时间 )logcard (卡号 )logid () logname(姓名) logbm (部门) 解决方案 ```select * from 同一表 a where logtime betw

SQL Server上进行表设计时表的主键设计问题

关于数据库的逻辑设计,是一个很广泛的问题.本文主要针对开发应用中遇到在MS SQL Server上进行表设计时,对表的主键设计应注意的问题以及相应的解决办法. 主键设计现状和问题 关于数据库表的主键设计,一般而言,是根据业务需求情况,以业务逻辑为基础,形成主键. 比如,销售时要记录销售情况,一般需要两个表,一个是销售单的概要描述,记录诸如销售单号.总金额一类的情况,另外一个表记录每种商品的数量和金额.对于第一个表(主表),通常我们以单据号为主键;对于商品销售的明细表(从表),我们就需要将主表的单

使用vs2010生成SQL Server 随机数据

原文:使用vs2010生成SQL Server 随机数据 前几天做测试数据,偶然发现vs2010中有一个生成随机数据的功能,记录下来,方便以后使用,确实非常的好用灵活快捷. 为了简单扼要的说明,下面我用一个实例来说明如何快捷使用: 在VS2010创建数据库项目,添加SQL Server 2008数据库项目,这里第一次使用者可以选择2008向导: 向导后,选择相关的配置: 最后部署完成即可,没有特殊要求的就直接默认就可以注意选择导入数据库架构出的数据库即可默认数据库. 在VS2010中建立数据库连

将SQL Server中的表变成txt文件

方法一:用BCP命令 bcp 实用工具 bcp 实用工具在 Microsoft? SQL Server? 2000 实例和数据文件之间以用户指定的格式复数据. 语法 bcp {[[database_name.][owner].]{table_name | view_name} | "query"} {in | out | queryout | format} data_file [-m max_errors] [-f format_file] [-e err_file] [-F fir

Sql Server中的表访问方式Table Scan, Index Scan, Index Seek

  Sql Server中的表访问方式Table Scan, Index Scan, Index Seek 0.参考文献 oracle表访问方式 Index Seek和Index Scan的区别以及适用情况 1.oracle中的表访问方式 在oracle中有表访问方式的说法,访问表中的数据主要通过三种方式进行访问: 全表扫描(full table scan),直接访问数据页,查找满足条件的数据 通过rowid扫描(table access by rowid),如果知道数据的rowid,那么直接通

SQL SERVER 2014 内存表 测试 结果慢 (2016-05-16)

问题描述 SQL SERVER 2014 内存表 测试 结果慢 (2016-05-16) 50C 大家好, 最近下了一个 SQL 2014 64位企业版, 安装环境:WIN7 X64 企业版 台式机环境为: I7 4770K, 16G 内存 , 机械硬盘: 一张是传统的表 disk_card 一张是内存表 snap_card,结构完全相同 两张表记录条数,均为 27752311 条, 而且内容完全一样(从disk__card 整表复制到snap__card的) disk_card 无索引 ( 其