更快地更新SQL Server表中的所有行

问题描述:

是否有更有效的方法来编写此代码?或者用更少的代码?更快地更新SQL Server表中的所有行

SELECT * 
INTO #Temp 
FROM testtemplate 

Declare @id INT 
Declare @name VARCHAR(127) 

WHILE (SELECT Count(*) FROM #Temp) > 0 
BEGIN 

    SELECT TOP 1 @id = testtemplateid FROM #Temp 
    SELECT TOP 1 @name = name FROM #Temp 

    UPDATE testtemplate 
    SET testtemplate.vendortestcode = (SELECT test_code FROM test_code_lookup WHERE test_name = @name) 
    WHERE testtemplateid = @id 

    --finish processing 
    DELETE #Temp Where testtemplateid = @id 
END 
DROP TABLE #Temp 
+1

见http://*.com/questions/1293330/how-can-i-do-an-update-statement-with-join-in-sql为一个关于如何做到这一点的指针,虽然乔是正确的(+1)(并且在打字时比我更快!) – dash 2011-12-19 15:55:52

您可以在单个UPDATE中做到这一点,无需循环。

UPDATE tt 
    SET vendortestcode = tcl.test_code 
    FROM testtemplate tt 
     INNER JOIN test_code_lookup tcl 
      ON tt.name = tcl.test_name 
+0

哇,我应该想到这一点。我不知道你可以连接那些实际上没有约束(相关键)的表。这太酷了,非常强大! – MacGyver 2011-12-20 16:51:44

你可以尝试一个更新这样的:

UPDATE A 
SET A.vendortestcode = B.test_code 
FROM testtemplate A 
INNER JOIN test_code_lookup B 
ON A.name = B.test_name 

而且,你正在做的方式,现在是错误,因为你正在服用TOP 1 Id和TOP 1名在两个单独的querys中,没有ORDER BY,所以它不确定你是否为你的ID使用了正确的名字。

+0

+1订购评论!这是人们对SQL有最危险的错误假设之一。 – JNK 2011-12-19 16:08:24

+0

@JNK - 是的,在那些代码中可以改进的东西中,我认为在这两个查询中缺少'ORDER BY'是最紧迫的一个。 – Lamak 2011-12-19 16:17:24

你可以写一个函数来更新vendortestcode。然后你的代码减少到一个SQL语句:

update testtemplate set vendortestcode = dbo.get_test_code_from_name(name)