2015-12-09 2 views
0

У меня есть таблица, содержащая некоторые данные, которые необходимо обновить. Предположим, что структура таблицыfor loop in transact sql

(Code, Col1, Col2, Col3) 

мне нужно запустить обновление на конкретных строк, которые имеют значение кода (скажем, значения являются (1,3,4,5,9,6,30,25,87,100)).

Значение Col3 - Col1 + Col2, а значения Col1 - (1001,1025,400,25,963,13,432,25,87,100).

Я создал следующий SQL-запрос:

Declare @Col1 float 
Declare @Code nvarchar 

set @Col1 = 1001 
set @Code = 1 

update MyTable set 
    Col1 = @Col1, 
    Col3 = @Col1 + Col2 
where Code = @Code 

Таким образом, вместо того, чтобы скопировать весь этот код после Declare линий и вручную присвоения значений, можно создать два массива, один для значений COL1 другой для значений кода и итерации через Кодекс и обновление его динамически?

+4

Я не совсем понимаю, что вы намерены делать, но я абсолютно уверен, что вам не нужна петля. Помните, что sql настроен на основе набора, а не на основе строк. – HoneyBadger

ответ

2

Обычно итерация по строкам данных с использованием циклов или курсоров считается плохой практикой в ​​SQL, так как в большинстве случаев она намного медленнее.

В вашем конкретном случае нет необходимости перебирать некоторые «массивы» для выполнения нужного обновления.

Вместо этого вы можете создать временную таблицу, как это:

create table #temp_table (Col1 float, Code nvarchar(10)) 

заполнить его с данными, такими как:

insert into #temp_table (Col1, Code) 
select 1001, '1' 
union all 
select 1025, '3' 
... and so on 

, а затем выполнить ваше обновление:

update MyTable set 
    Col1 = T1.Col1, 
    Col3 = T1.Col1 + Col2 
from MyTable as T 
    inner join #temp_table as T1 on T.Code = T1.Code 
+0

Продвинутый контроль над CTE, поскольку временная таблица обеспечивает более долгосрочную гибкость –

0

Вы надеваете» t нужен цикл для этого, вы можете просто создать таблицу Cte (или temp) со значениями, которые вы хотите обновить, и JOIN к нему в UPDATE заявления:

;With ToUpdate (Code, Col1) As 
(
    Select 1, 1001  Union All 
    Select 3, 1025  Union All 
    Select 4, 400  Union All 
    Select 5, 25  Union All 
    Select 9, 963  Union All 
    Select 6, 13  Union All 
    Select 30, 432  Union All 
    Select 25, 25  Union All 
    Select 87, 87  Union All 
    Select 100, 100 
) 
Update T 
Set  Col1 = U.Col1, 
     Col3 = U.Col1 + Col2 
From MyTable  T 
Join ToUpdate U On U.Code = T.Code