我刚刚使用Microsoft SQL Server 2008 R2启动了SQL,我想选择一个ID列表并通过存储过程运行它们,但我不知道该怎么做。
SELECT Id
FROM UserId
WHERE ProgramId = @ProgramId
然后,我创建了一个名为temp_sp_UpdateIds
通常我可以用
运行存储过程EXEC temp_sp_UpdateIds @ProgramId
但我不确定如何使用select语句返回的Ids列表运行存储过程并将其放在@ProgramId
下
我是否需要将Ids存储在本地表中?
感谢。
答案 0 :(得分:2)
创建表类型和SP
CREATE TYPE dbo.ListOfIds AS TABLE(Id int PRIMARY KEY)
GO
CREATE PROCEDURE dbo.temp_sp_UpdateIds
(
@ListOfIds dbo.ListOfIds READONLY
)
AS
BEGIN
...body of procedure
END
GO
调用具有表值参数的过程
DECLARE @ListOfIds dbo.ListOfIds
INSERT @ListOfIds
SELECT Id
FROM UserId
WHERE ProgramId = @ProgramId
EXEC dbo.temp_sp_UpdateIds @ListOfIds
请参阅SQLFiddle
答案 1 :(得分:0)
在正常情况下,您可以执行以下操作:
SELECT * FROM UserId WHERE ProgramId in (SELECT ProgramId FROM t WHERE ...)
如果程序通过选择某一列的结果填充@ParamId - 它必须有效
答案 2 :(得分:0)
你很遗憾地看着光标。概念是你将在第一个块中提供你的查询,声明你需要操作你的proc的变量然后迭代它们。
DECLARE CSR CURSOR
READ_ONLY
FOR SELECT ProgramId FROM UserId
DECLARE @programid int
OPEN CSR
FETCH NEXT FROM CSR INTO @programid
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
EXECUTE temp_sp_UpdateIds @programId
END
FETCH NEXT FROM CSR INTO @programId
END
CLOSE CSR
DEALLOCATE CSR
GO
我想到的另一个选择是在SQL中生成EXEC调用,将所有这些与分号连接起来然后执行。
答案 3 :(得分:0)
如果你可以将proc更改为一个函数(返回一个值 - 即使只是null
),你可以这样做:
SELECT temp_sp_UpdateIds(id) FROM UserId WHERE ProgramId=@ProgramId