更新SQL Server中每一行的最佳方法
我有这样的代码来创建随机表:()更新SQL Server中每一行的最佳方法,sql,sql-server,sql-update,Sql,Sql Server,Sql Update,我有这样的代码来创建随机表:() 我也试着使用游标语句,这样更好,但为什么while循环这么慢呢?还有其他更好的方法吗?如果要更新表中的每一行,只需在update语句中省略where子句。我认为OP想要更新特定行,这就是为什么where子句。因此,它不能被忽略。@MichałTurczyn可能是,但问题两次表明OP想要更新每一行。当我使用where子句时,它会更慢,并且它会用每一行中相同的一个随机字符串更新列random_字符串。我想用新的随机唯一字符串更新每一行、每一列的rand_字符串(执行
我也试着使用游标语句,这样更好,但为什么while循环这么慢呢?还有其他更好的方法吗?如果要更新表中的每一行,只需在update语句中省略where子句。我认为OP想要更新特定行,这就是为什么
where
子句。因此,它不能被忽略。@MichałTurczyn可能是,但问题两次表明OP想要更新每一行。当我使用where子句时,它会更慢,并且它会用每一行中相同的一个随机字符串更新列random_字符串。我想用新的随机唯一字符串更新每一行、每一列的rand_字符串(执行一条语句不会比执行循环中的许多语句慢)。但是,我的答案不再直接相关,因为您的问题已更改。好,但是为什么我在while循环中更新10000行时要花53秒,而100000行要花1个多小时呢?那就使用newid()
作为updaterandom\u data SET rand\u string=newid()
怎么样;
-- Create a table with primary key
CREATE TABLE fyi_random
(
id INT,
rand_integer INT,
rand_number numeric(18,9),
rand_datetime DATETIME,
rand_string VARCHAR(80)
);
-- Insert rows with random values
DECLARE @row INT;
DECLARE @string VARCHAR(80), @length INT, @code INT;
SET @row = 0;
WHILE @row < 100000
BEGIN
SET @row = @row + 1;
-- Build the random string
SET @length = ROUND(80*RAND(),0);
SET @string = '';
WHILE @length > 0
BEGIN
SET @length = @length - 1;
SET @code = ROUND(32*RAND(),0) - 6;
IF @code BETWEEN 1 AND 26
SET @string = @string + CHAR(ASCII('a')+@code-1);
ELSE
SET @string = @string + ' ';
END
-- Ready for the record
SET NOCOUNT ON;
INSERT INTO fyi_random
VALUES (@row,
ROUND(2000000*RAND()-1000000,0),
ROUND(2000000*RAND()-1000000,9),
CONVERT(DATETIME, ROUND(60000*RAND() - 30000, 9) ),
@string)
END
PRINT 'Rows inserted: '+CONVERT(VARCHAR(20),@row);
GO
...
SET NOCOUNT ON;
UPDATE random_data
SET rand_string = @string
WHERE id = @row;