我有一个PersonInformation
表,其中包含以下信息:
| PersonID | Name | Status
+----------+------+------------
| 1234 | John | Active
| 5678 | Mary | Inactive
| 1090 | Tery | Active
| 1554 | Cary | Inactive
我还有一个名为SpStats
的存储过程,它使用PersonID
进行一些计算并返回stat_a,stat_b的结果。
我需要使用SpStats
为PersonInformation
表中的每个活跃人员执行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 |
答案 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
希望这对你有所帮助。