【问题标题】:TSQL - How to iterate a list of stringsTSQL - 如何迭代字符串列表
【发布时间】:2013-08-22 12:17:29
【问题描述】:

我想创建一个将我的所有作业插入数据库的过程。
(a. 我所有的工作都具有相同的特征。b. SSDT 不支持工作代码管理)

现在,我想创建一个脚本来插入所有这些,作为一个 c# 开发人员,我想我需要用他们的名字初始化一个列表。

我在谷歌搜索时发现,这样做的方法是使用内存表,我能想到的最好的就是这个。

declare @jobsNames table(Id int, JobName nvarchar(100))

insert into @jobsNames (Id,JobName)
    select 1,'JobName1' union
    select 2,'JobName2' union
    ......

BEGIN TRANSACTION

DECLARE JobsCursor CURSOR FOR SELECT JobName FROM @jobsNames
OPEN JobsCursor

FETCH NEXT FROM JobsCursor INTO @JobName
WHILE @@Fetch_status = 0
BEGIN
     .. do stuff

     FETCH NEXT FROM JobsCursor INTO @JobName
     WHILE @@Fetch_status = 0
END
COMMIT TRANSACTION

问题-

这是最短/推荐的方式吗?
(这似乎是一个 foreach 的 hellotof 代码)

【问题讨论】:

    标签: tsql database-cursor


    【解决方案1】:
    declare @jobNames table(Id int, JobName nvarchar(100))
    
    insert @jobNames values
        (1, 'JobName1'),
        (2, 'JobName2'),
    --
        (10, 'JobName10')
    
    while exists(select 1 from @jobNames)
    begin
        declare @id int, @name nvarchar(100)
        select top 1 @id = Id, @name = JobName from @jobNames
        delete from @jobNames where Id = @Id
    
        -- Do stuff here
    end
    

    【讨论】:

    • 看来应该是insert into @jobNames,否则至少SQL Server会输出语法错误。
    【解决方案2】:

    就我个人而言,我避免像瘟疫一样使用光标。请确保您必须迭代而不是基于您的工作集。他们不会无缘无故地称它为RBAR

    DECLARE @counter INT, @max INT
    
    SELECT @counter = 1, @max = max(id)
    FROM @jobsNames
    
    WHILE @counter <= @max
    BEGIN
        SELECT @val1 = val1 ... FROM @jobNames where ID = @counter
        -- .. do stuff
        SET @counter = @counter + 1
    END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      • 2021-04-14
      • 2010-10-18
      • 2011-05-01
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多