2013-08-22 51 views
2

我想创建一个将所有作业插入到数据库的过程。
(a。所有我的作业有相等的特性; B。SSDT犯规支持工作代码管理)TSQL - 如何迭代字符串列表

现在,我想创建一个脚本,将所有这些,为AC#develpoer我想我需要初始化与他们的名字列表。

我发现,当用谷歌搜索做的方式是在内存表中,最好的我可以来这是。

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 

问题 -

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

回答

0

我个人以避免像鼠疫游标。请确保您必须迭代而不是基于您的工作集。他们不称之为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 
3
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