Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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中每一行的最佳方法_Sql_Sql Server_Sql Update - Fatal编程技术网

更新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;