【问题标题】:Quicker way to update all rows in a SQL Server table更新 SQL Server 表中所有行的更快方法
【发布时间】:2012-01-23 17:30:24
【问题描述】:

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

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

【问题讨论】:

标签: sql sql-server-2008 loops


【解决方案1】:

您可以在单个 UPDATE 中执行此操作,而无需循环。

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

【讨论】:

  • 哇,我早该想到的。我不知道您可以将实际上没有约束(相关键)的表彼此连接起来。这太酷了,而且非常强大!
【解决方案2】:

您可以尝试这样的单个更新:

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 取了正确的名字。

【讨论】:

  • +1 评论订购!这是人们对 SQL 最危险的错误假设之一。
  • @JNK - 是的,在所有可以改进该代码的事情中,我认为这两个查询中缺少ORDER BY 是最紧迫的。
【解决方案3】:

您可以编写一个函数来更新 vendortestcode。然后你的代码就简化为一条 SQL 语句:

update testtemplate set vendortestcode = dbo.get_test_code_from_name(name)

【讨论】:

    猜你喜欢
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2011-02-21
    • 1970-01-01
    • 2020-06-17
    • 2021-09-03
    • 1970-01-01
    相关资源
    最近更新 更多