Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL Server 2008插入大量记录_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

使用SQL Server 2008插入大量记录

使用SQL Server 2008插入大量记录,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我想我已经找到了一种生成随机数的方法。但是在SQLServer中,什么是高效循环的最佳方式呢? 我有以下SQL: DECLARE @Random1 INT; DECLARE @Random2 INT; DECLARE @Random3 INT; DECLARE @Random4 INT; DECLARE @Random5 INT; DECLARE @Random6 INT; DECLARE @Upper INT; DECLARE @Lower INT; ---- This will crea

我想我已经找到了一种生成随机数的方法。但是在SQLServer中,什么是高效循环的最佳方式呢? 我有以下SQL:

DECLARE @Random1 INT;
DECLARE @Random2 INT;
DECLARE @Random3 INT;
DECLARE @Random4 INT;
DECLARE @Random5 INT;
DECLARE @Random6 INT;

DECLARE @Upper INT;
DECLARE @Lower INT;

---- This will create a random number between 1 and 49
SET @Lower = 1 ---- The lowest random number
SET @Upper = 49 ---- The highest random number
SELECT @Random1 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random2 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random3 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random4 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random5 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random6 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
--SELECT @Random;

INSERT INTO [lotto].[dbo].[CustomerSelections]
           ([draw_date]
           ,[val1]
           ,[val2]
           ,[val3]
           ,[val4]
           ,[val5]
           ,[val6])
     VALUES
           (
           '2013-07-05'
           ,@Random1
           ,@Random2
           ,@Random3
           ,@Random4
           ,@Random5
           ,@Random6 
           )
让SQL Server运行此SQL 100000次的最佳方法是什么?

这需要4秒钟:

SET NOCOUNT ON
DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <=100000)
BEGIN

--Do Stuff
DECLARE @Random1 INT, @Random2 INT, @Random3 INT, @Random4 INT, @Random5 INT, @Random6 INT, @Upper INT, @Lower INT
---- This will create a random number between 1 and 49
SET @Lower = 1 ---- The lowest random number
SET @Upper = 49 ---- The highest random number
SELECT @Random1 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random2 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random3 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random4 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random5 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random6 = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
--SELECT @Random;

INSERT INTO #test  ([draw_date],[val1],[val2],[val3],[val4],[val5],[val6])
     VALUES ('2013-07-05',@Random1,@Random2,@Random3,@Random4,@Random5,@Random6)  

SET @intFlag = @intFlag + 1
END
GO
作为参考,一个简单的WHILE循环shell:

DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <=5000)
BEGIN  
--Do Stuff

--Iterate
SET @intFlag = @intFlag + 1
END
GO
DECLARE@intFlag INT
设置@intFlag=1

而(@intFlag在一个语句中完成所有操作而不使用循环将是最有效的方法

INSERT INTO [lotto].[dbo].[CustomerSelections]
           ([draw_date]
           ,[val1]
           ,[val2]
           ,[val3]
           ,[val4]
           ,[val5]
           ,[val6])
SELECT TOP (100000 )
           '2013-07-05',
           1 + ABS(CRYPT_GEN_RANDOM(8) % 49),
           1 + ABS(CRYPT_GEN_RANDOM(8) % 49),
           1 + ABS(CRYPT_GEN_RANDOM(8) % 49),
           1 + ABS(CRYPT_GEN_RANDOM(8) % 49),
           1 + ABS(CRYPT_GEN_RANDOM(8) % 49),
           1 + ABS(CRYPT_GEN_RANDOM(8) % 49)
FROM master..spt_values v1,
     master..spt_values v2

“高效”和“循环”在谈到SQL Server时,通常不在同一句话中使用。RDBMS针对集合操作进行了优化。对于100K记录,使用外部程序将数据生成CSV文件,然后使用来加载表可能更有效。我使用SQL Server生成随机数。我无法在服务器外部生成!您尝试过j吗ust循环。它仍然会运行得很快。如果每个循环都有100个值,那么速度会更快。如果你想在另一个步骤中创建下一组随机数。你知道.NET和大多数开发环境都有随机数生成器。我现在还不想编写C#代码。还不够了解:(…SQL可以使用哪些循环?我还年轻,还在学习!:(我会拉着申报单出发loop@Blam同意,只是想简单地显示循环内部的操作逻辑,可能需要编辑。如果您尝试插入用户数据库中的正常表而不是
#temp
表,您肯定会发现这比第一次测试花费的时间要长得多。100000个事务提交MartinSmith说得好,在我的回答中没有澄清这一点,现在已经更新了。快速运行到临时表中,从临时表插入完整集也很快。或者在整个循环中执行
开始转换…提交
。之所以
#temp
表的性能更好,是因为在提交事务时,tempdb中的日志页不需要刷新,但在用户数据库中,您可能会等待日志写入100000次。不过,基于集合的插入仍然更可取。
INSERT INTO [lotto].[dbo].[CustomerSelections]
           ([draw_date]
           ,[val1]
           ,[val2]
           ,[val3]
           ,[val4]
           ,[val5]
           ,[val6])
SELECT TOP (100000 )
           '2013-07-05',
           1 + ABS(CRYPT_GEN_RANDOM(8) % 49),
           1 + ABS(CRYPT_GEN_RANDOM(8) % 49),
           1 + ABS(CRYPT_GEN_RANDOM(8) % 49),
           1 + ABS(CRYPT_GEN_RANDOM(8) % 49),
           1 + ABS(CRYPT_GEN_RANDOM(8) % 49),
           1 + ABS(CRYPT_GEN_RANDOM(8) % 49)
FROM master..spt_values v1,
     master..spt_values v2