我有一个大约500 ModuleID's
的列表,我想在下面的存储过程中运行。我假设不是要单独粘贴每个副本,而是要想有一种方法可以创建循环并以编程方式进行。
USE [mydb]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[DeleteModule]
@ModuleId = 3363
SELECT 'Return Value' = @return_value
GO
答案 0 :(得分:1)
有两种不同的方法可以执行此操作-您的脚本可以生成查询列表,您可以复制/粘贴并执行查询,或者编写查询以生成动态SQL并执行它。
第一个选项更容易-只需编写一个简单的select语句,如下所示:
select CONCAT('exec [dbo].[DeleteModule] ', ModuleId)
from [Table with module IDs]
where ModuleId is not null
在执行上述脚本时,它将为您提供语句列表,您可以将其复制,粘贴到查询窗口中并执行。一次性或维护任务很方便。
另一个选择是生成这些查询并动态执行它们。最简单的方法是使用cursor遍历数据,生成查询并使用exec或sp_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
循环体(在begin
和end
之间)将针对游标返回的每一行(即每个ModuleId)执行。它将对@sql
中存储的每个值执行@CurrentModuleId
中的语句。