2

我刚刚使用 Microsoft SQL Server 2008 R2 启动 SQL,我想选择一个 Id 列表并通过存储过程运行它们中的每一个,但不知道该怎么做。

SELECT Id 
FROM UserId 
WHERE ProgramId = @ProgramId

然后,我创建了一个名为temp_sp_UpdateIds

通常我可以运行存储过程

EXEC temp_sp_UpdateIds @ProgramId

但我不确定如何使用从 select 语句返回的 Id 列表运行存储过程并将其放在@ProgramId

我需要将 ID 存储在本地表中吗?

谢谢。

4

4 回答 4

4

您可以使用表值参数

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

于 2013-05-07T21:28:43.310 回答
1

不幸的是,您正在寻找光标。概念是您将在第一个块中提供您的查询,声明您需要操作您的 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 调用,用分号将所有这些调用连接在一起,然后执行它。

于 2013-05-07T20:49:58.420 回答
1

如果您可以将 proc 更改为一个函数(返回一个值 - 甚至只是null),您可以简单地执行以下操作:

SELECT temp_sp_UpdateIds(id) FROM UserId WHERE ProgramId=@ProgramId
于 2013-05-07T20:52:14.940 回答
0

在正常情况下,您可以执行以下操作:

SELECT * FROM UserId WHERE ProgramId in (SELECT ProgramId FROM t WHERE ...)

如果程序用一列选择结果之类的东西填充@ParamId - 它必须工作

于 2013-05-07T20:49:22.337 回答