2011-12-19 6 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を参照してくださいJoeは正しいですが(+1)(そして私が入力したよりもはるかに速いです!) – dash

答えて

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

5

あなたはこのような単一の更新を試みることができる:あなたがTOP 1同上とTOP 1名を取っているので、また

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

を、あなたは今それをやっている方法は、間違っですORDER BYのない2つの独立した質問では、IDの正しい名前を使用しているかどうかはわかりません。

+0

注文のコメントは+1です!これは人々がSQLに関してもっているもっとも危険な誤った仮定の1つです。 – JNK

+0

@JNK - そういうコードで改善できるもののうち、2つのクエリでORDER BYが不足していることが最も緊急なものだと思います。 – Lamak

0

vendortestcodeを更新する関数を書くことができます。次に、あなたのコードは、1つのSQL文に減らし:

update testtemplate set vendortestcode = dbo.get_test_code_from_name(name) 
関連する問題