为存储的过程创建一个ID循环

时间:2019-01-25 22:10:57

标签: tsql sql-server-2012

我有一个大约500 ModuleID's的列表,我想在下面的存储过程中运行。我假设不是要单独粘贴每个副本,而是要想有一种方法可以创建循环并以编程方式进行。

USE [mydb]
GO

DECLARE @return_value int

EXEC    @return_value = [dbo].[DeleteModule]
        @ModuleId = 3363

SELECT  'Return Value' = @return_value

GO

1 个答案:

答案 0 :(得分:1)

有两种不同的方法可以执行此操作-您的脚本可以生成查询列表,您可以复制/粘贴并执行查询,或者编写查询以生成动态SQL并执行它。

第一个选项更容易-只需编写一个简单的select语句,如下所示:

select CONCAT('exec [dbo].[DeleteModule] ', ModuleId)
from [Table with module IDs]
where ModuleId is not null

在执行上述脚本时,它将为您提供语句列表,您可以将其复制,粘贴到查询窗口中并执行。一次性或维护任务很方便。

另一个选择是生成这些查询并动态执行它们。最简单的方法是使用cursor遍历数据,生成查询并使用execsp_executesql执行它:

declare @sql nvarchar(max), @ParamsDefinition nvarchar(max), @CurrentModuleId int
set @sql = N'exec exec [dbo].[DeleteModule] @ModuleId'
set @ParamsDefinition  = N'@ModuleId int'
declare cModules cursor local fast_forward forward_only read_only for
    select ModuleId
    from [Table with module IDs]
    where ModuleId is not null
open cModules
fetch next from @cModules into @CurrentModuleId
while @@FETCH_STATUS = 0
begin
    exec sp_executesql @sql, @ParamsDefinition, @ModuleId = @CurrentModuleId
    fetch next from @cModules into @CurrentModuleId
end
close cModules
deallocate cModules

循环体(在beginend之间)将针对游标返回的每一行(即每个ModuleId)执行。它将对@sql中存储的每个值执行@CurrentModuleId中的语句。