transact sql中的for循环

时间:2015-12-09 15:15:17

标签: sql sql-server sql-server-2008 tsql for-loop

我有一个包含一些需要更新的数据的表。我们假设表结构是

(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

因此,在声明行和手动分配值之后复制所有这些代码,是否可以创建两个数组,一个用于代码值的其他Col1值,并迭代代码并动态更新它?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您不需要为此循环,您只需使用要更新的值创建Cte(或临时表),并在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