2011-12-19 90 views
4

是否有更有效的方法來編寫此代碼?或者用更少的代碼?更快地更新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://stackoverflow.com/questions/1293330/how-can-i-do-an-update-statement-with-join-in-sql爲一個關於如何做到這一點的指針,雖然喬是正確的(+1)(並且在打字時比我更快!) – dash 2011-12-19 15:55:52

回答

11

您可以在單個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

5

你可以嘗試一個更新這樣的:

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

0

你可以寫一個函數來更新vendortestcode。然後你的代碼減少到一個SQL語句:

update testtemplate set vendortestcode = dbo.get_test_code_from_name(name)