【问题标题】:for loop in transact sql事务 sql 中的 for 循环
【发布时间】:2015-12-09 15:15:16
【问题描述】:

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

(Code, Col1, Col2, Col3)

我需要对具有 Code 值的特定行运行更新(假设这些值为 (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 值,另一个用于 Code 值并遍历代码并动态更新它?

【问题讨论】:

  • 我不太了解您的意图,但我很确定您不需要循环。记住 sql 是基于集合的,而不是基于行的。

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


【解决方案1】:

通常使用循环或游标对数据行进行迭代,这在 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

【讨论】:

  • 在 CTE 上对此表示赞同,因为临时表提供了更多的长期灵活性
【解决方案2】:

您不需要循环,您只需创建一个包含要更新的值的 Cte(或临时表),并在 UPDATE 语句中将其 JOIN

;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

【讨论】:

    猜你喜欢
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多