SQL选择ID列表并通过SP运行它们

时间:2013-05-07 20:45:03

标签: sql sql-server-2008-r2

我刚刚使用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存储在本地表中?

感谢。

4 个答案:

答案 0 :(得分:2)

您可以使用Table-Valued Parameters

创建表类型和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