执行具有多个ID的存储过程

时间:2018-02-22 19:35:23

标签: sql-server tsql stored-procedures

我有一个PersonInformation表,其中包含以下信息:

| PersonID | Name | Status  
+----------+------+------------
| 1234     | John | Active 
| 5678     | Mary | Inactive 
| 1090     | Tery | Active 
| 1554     | Cary | Inactive 

我还有一个名为SpStats的存储过程,它使用PersonID进行一些计算并返回stat_a,stat_b的结果。

我需要使用SpStatsPersonInformation表中的每个活跃人员执行PersonID存储过程。

基本上是

SELECT PersonId, Name, Status, {Exec SpStats for related PersonID} 
FROM PersonInformation  
WHERE status = 'Active'

预期结果如下:

| PersonID | Name | Status | stat_a | stat_b |
+----------+------+--------+--------+--------+
| 1234     | John | Active |   25   |   45   |
| 1090     | Tery | Active |   10   |   67   |

3 个答案:

答案 0 :(得分:1)

如果您可以创建一个用户定义的表函数来执行存储过程所执行的操作,则可以使用cross apply为选择中的每一行获取结果。

假设它接受PersonID值,可以这样做:

SELECT PersonId, [Name], [Status], stat_a, stat_b
FROM PersonInformation  
CROSS APPLY dbo.UDFStats(PersonID) as stats
WHERE [Status] = 'Active'

请注意,CROSS APPLY不适用于存储过程。

答案 1 :(得分:0)

像这样创建自己的自定义类型

--Table Valued Parameter Type used for passing lists of Int IDs.
CREATE TYPE [MySchema].[UniqueIDListType] AS TABLE
(
    [ID] Int NOT NULL
);

然后在您的存储过程中将输入参数设置为您的类型

CREATE PROCEDURE [MySchema].[MyProc]
    @MyIDList [MySchema].[UniqueIDListType] READONLY
AS

然后你去,你可以像选择

中的表一样使用你的参数
WHERE EXISTS (SELECT * FROM @MyIDList WHERE ID = PersonID);

然后,您将获得每个id的完整结果集。像任何其他参数一样将它传递给proc,你只需要将id格式化为这个单独的集合。奖励是您可以在任何需要重新执行此操作的地方重复使用新的表值参数。可重用性!耶!

如果你不能这样做,那么我假设你不能用你的要求或权限创建一个函数,我会以编程方式循环并在你的sql中创建一个表变量,调用proc为每个人,将结果插入到您的表中,并在完成后将其加入到最终选择结果集中。

答案 2 :(得分:0)

如果你有桌子

CREATE TABLE Country (
     CountryId      UNIQUEIDENTIFIER    
    ,Abbreviation   VARCHAR(10)
    ,Name           VARCHAR(100)
)

用户定义的功能

CREATE FUNCTION udfConcatenate(@value1 VARCHAR(4000), @value2 VARCHAR(4000))
RETURNS VARCHAR(8000)
AS
BEGIN
    RETURN CONCAT(@value1, @value2)
    /* HERE YOU CAN EXECUTE YOU SOTRED PROCEDURE AND RETURN THE RESULT */
END

您可以执行

select  c.CountryId, dbo.udfConcatenate(c.Abbreviation, c.Name) from country AS C

用户定义函数可以应用于每一行。 因此,用户定义函数执行Sotred Procedure并返回结果。 并且,您在SELECT中使用用户定义函数。

修改

WHILE方式

DECLARE @abb VARCHAR(10)
DECLARE @name VARCHAR(200)

DECLARE cur1 CURSOR FOR
SELECT Abbreviation, Name FROM Country 

OPEN cur1
FETCH NEXT FROM cur1 INTO @abb, @name

WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT dbo.udfConcatenate(@abb, @name)

    /* HERE YOU CAN EXECUTE THE SP AND STORE THE RESULTS IN A TEMP TABLE */

    FETCH NEXT FROM cur1 INTO @abb, @name
END

CLOSE cur1
DEALLOCATE cur1

希望这对你有所帮助。