如何循环类似于for循环

时间:2013-08-29 00:07:00

标签: tsql

我在这里检查了论坛并了解t-SQL没有FOR循环。但是,我想知道在这里做我需要做的最好的方法。

这是我的表格(mytable)简化:

id  Code1  Code2  Code3  CodeDesc1  CodeDesc2  CodeDesk3
__  _____  _____  _____  _________  _________  _________
1   ABC    DEF    ZYX
2   DEF    ABC    ZYX
3   ZYX    GHJ    ABC

在实际情况中,还有更多行和更多Code和CodeDesc列。我正在将SAS代码转换为T-SQL,SAS代码具有此(简化):

DO  x = 1 to 4 ;
 IF code0(x) = 'ABC' THEN CodeDesc0(x) = 'ABC Description'
ELSE 
 IF code0(x) = 'DEF' THEN CodeDesc0(x) = 'DEF Description'
ELSE
 IF code0(x) = 'ZYX' THEN CodeDesc0(x) = 'ZYX Description'

我的问题是如何在T-SQL中做类似的事情。

感谢您的建议。

添加更多信息......

如果我使用直接T-SQL做我需要做的事情,没有任何编程,它将是这样的:

UPDATE mytable SET CodeDesc1 = 'ABC Description' WHERE Code1 = 'ABC'
UPDATE mytable SET CodeDesc2 = 'ABC Description' WHERE Code2 = 'ABC'
UPDATE mytable SET CodeDesc3 = 'ABC Description' WHERE Code3 = 'ABC'
UPDATE mytable SET CodeDesc1 = 'DEF Description' WHERE Code1 = 'DEF'
UPDATE mytable SET CodeDesc2 = 'DEF Description' WHERE Code2 = 'DEF'
UPDATE mytable SET CodeDesc3 = 'DEF Description' WHERE Code3 = 'DEF'

因此,正如您可以看到几个不同的代码和描述,我可以轻松地编写100个更新语句来涵盖所有可能性。

我希望这有助于减轻光线。

2 个答案:

答案 0 :(得分:3)

不要使用循环。永远不应该在循环中完成更新!!!!

我要做的是创建一个将abreviations映射到long描述的表。 然后你可以轻松添加新的,你可以用这种方式编写更新:

Update a
set description = b.description
from tableA a 
join tableb b on a.abbreviation = b.abbrevation
where a.description <> b.descrioption or a.description is null

答案 1 :(得分:2)

以下是您正在寻找的示例:

/********** example 1 **********/ 

declare @au_id char( 11 )

set rowcount 0
select * into #mytemp from authors

set rowcount 1

select @au_id = au_id from #mytemp

while @@rowcount <> 0
begin
    set rowcount 0
    select * from #mytemp where au_id = @au_id
    delete #mytemp where au_id = @au_id

    set rowcount 1
    select @au_id = au_id from #mytemp<BR/>
end
set rowcount 0

从这里采取:http://support.microsoft.com/kb/111401