更新SQL Server表中所有行的更快方法

更新SQL Server表中所有行的更快方法,sql,sql-server-2008,loops,Sql,Sql Server 2008,Loops,有没有更有效的方法来编写此代码?还是代码更少 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

有没有更有效的方法来编写此代码?还是代码更少

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 tt
    SET vendortestcode = tcl.test_code
    FROM testtemplate tt
        INNER JOIN test_code_lookup tcl
            ON tt.name = tcl.test_name

您可以尝试以下单个更新:

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名称,而没有使用
ORDER BY
,因此无法确定您的Id是否使用了正确的名称。

您可以编写一个函数来更新供应商代码。然后,您的代码将简化为一条SQL语句:

update testtemplate set vendortestcode = dbo.get_test_code_from_name(name)

请参阅,以获取有关如何执行此操作的指针,尽管Joe是正确的(+1)(而且打字速度比我快得多!)+1获取有关排序的注释!这是人们对SQL最危险的错误假设之一。@JNK-是的,在该代码可以改进的所有方面中,我认为在这两个查询中缺少排序依据是最紧迫的。哇,我应该想到这一点。我不知道可以将实际上没有约束(相关键)的表彼此连接起来。这很酷,而且非常强大!