我想创建一个将所有作业都插入数据库的程序 (a。我所有的工作都有相同的特点.b.SSDT不支持工作代码管理)
现在,我想创建一个脚本来插入所有这些脚本,并且作为一个c#develpoer我认为我需要用他们的名字初始化一个列表。
我在google搜索时发现,这样做的方法是使用内存表,我能带来的最好的就是这个。
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的代码)
答案 0 :(得分:4)
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
答案 1 :(得分: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