Более быстрый способ обновления всех строк в таблице SQL Server - PullRequest
6 голосов
/ 19 декабря 2011

Есть ли более эффективный способ написания этого кода? Или с меньшим кодом?

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

Ответы [ 3 ]

12 голосов
/ 19 декабря 2011

Вы можете сделать это за одно ОБНОВЛЕНИЕ без необходимости зацикливания.

UPDATE tt
    SET vendortestcode = tcl.test_code
    FROM testtemplate tt
        INNER JOIN test_code_lookup tcl
            ON tt.name = tcl.test_name
6 голосов
/ 19 декабря 2011

Вы можете попробовать одно обновление, как это:

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 и имя TOP 1 в двух отдельных запросах, без ORDER BY, поэтому не уверен, что вы берете правильное имя для вашего удостоверения личности.

1 голос
/ 19 декабря 2011

Вы можете написать функцию для обновления кода поставщика. Тогда ваш код сводится к одной инструкции SQL:

update testtemplate set vendortestcode = dbo.get_test_code_from_name(name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...