更快地更新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
答
您可以在单个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使用了正确的名字。
答
你可以写一个函数来更新vendortestcode。然后你的代码减少到一个SQL语句:
update testtemplate set vendortestcode = dbo.get_test_code_from_name(name)
见http://stackoverflow.com/questions/1293330/how-can-i-do-an-update-statement-with-join-in-sql为一个关于如何做到这一点的指针,虽然乔是正确的(+1)(并且在打字时比我更快!) – dash 2011-12-19 15:55:52