我想通过SELECT
查询在每个ID返回上运行存储过程。是否有一种简单的方法可以执行以下操作:
FOREACH (SELECT ID FROM myTABLE WHERE myName='bob') AS id
BEGIN
EXEC @return_value = [dbo].[spMYPROC]
@PARAM1 = id
@PARAM2 = 0
END
答案 0 :(得分:1)
因为我昨天碰巧回答了一个非常similar question,所以我有这个代码很方便。正如其他人所说,它可能不是最好的方法,但仍然很高兴学习如何使用while循环。
假设一个名为“Customer”的表
declare @Id int
select @Id = MIN(Id)
from Customer c
while(select COUNT(1)
from Customer c
where c.Id >= @Id) > 0
begin
--run your sproc right here
select @Id = MIN(Id)
from Customer c
where c.Id > @Id
end
答案 1 :(得分:0)
这里有两个选项
选项1使用拆分功能
传递逗号分隔的ID列表并使用“拆分”功能在“过程”中对这些值进行拆分并对其执行任何操作。
要 让它工作你需要两件事
1)创建一个函数 接受逗号删除字符串并将其拆分。
2)修改你 存储过程并以通过的方式在此处添加此功能 参数传递给该存储过程内的函数 该函数在将值传递到商店之前将其拆分 程序。
创建此功能第1个
功能定义
CREATE FUNCTION [dbo].[FnSplit]
(
@List nvarchar(2000),
@SplitOn nvarchar(5)
)
RETURNS @RtnValue table (Id int identity(1,1), Value nvarchar(100))
AS
BEGIN
WHILE(Charindex(@SplitOn,@List)>0)
BEGIN
INSERT INTO @RtnValue (value)
SELECT VALUE = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1)))
SET @List = SUBSTRING(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
END
INSERT INTO @RtnValue (Value)
SELECT VALUE = ltrim(rtrim(@List))
RETURN
END
修改你这样的程序
存储过程
ALTER Procedure [dbo].[spMYPROC] (@Param1 VARCHAR(1000)= NULL)
AS
BEGIN
SELECT * FROM TableName
where ColumnNAME IN (SELECT Value FROM dbo.FnSplit(@Param1,','))
END
GO
选项2表类型参数
创建一个表类型并更改你的proc以接受一个表类型参数,并在你的proc中做你想做的任何事情。
表类型
CREATE TYPE dbo.TYPENAME AS TABLE
(
Value int
)
GO
接受该类型参数的存储过程
ALTER PROCEDURE [dbo].[spMYPROC]
@TableParam TYPENAME READONLY
AS
BEGIN
SET NOCOUNT ON;
--Temp table to store passed Id values
declare @tmp_values table (value INT );
--Insert passed values to a table variable inside the proc
INSERT INTO @tmp_values (value)
SELECT Value FROM @TableParam
/* Do your stuff here whatever you want to do with Ids */
END
EXECUTE PROC
声明该类型的变量并使用您的值填充它。
DECLARE @Table TYPENAME --<-- Variable of this TYPE
INSERT INTO @Table --<-- Populating the variable
SELECT ID FROM myTABLE WHERE myName='bob'
EXECUTE [dbo].[spMYPROC] @Table --<-- Stored Procedure Executed
答案 2 :(得分:0)
DECLARE @ID INT, @return_value INT
DECLARE c CURSOR FOR
SELECT
ID
FROM myTABLE
WHERE myName = 'bob'
OPEN c; FETCH NEXT FROM c INTO @ID
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC @return_value = [dbo].[spMYPROC]
@PARAM1 = @ID,
@PARAM2 = 0
FETCH NEXT FROM c INTO @ID
END
CLOSE c; DEALLOCATE c;