您的问题是,这些 SP 可能提供结构上不同的行集。 SP 不仅仅是读取数据的正确方法...不知道您在 SP 中做什么,但使用 TVF 可能会更容易
以下示例如何实现您想要的:
CREATE PROCEDURE dbo.Test1
AS
BEGIN
SELECT * FROM (VALUES(1,'Test1_1'),(2,'Test1_2')) AS tbl(t1a,t1b);
END
GO
CREATE PROCEDURE dbo.Test2
AS
BEGIN
SELECT * FROM (VALUES('a','Test1_A',100),('b','Test1_B',200)) AS tbl(t2a,t2b,t2c);
END
GO
CREATE PROCEDURE dbo.Test3
AS
BEGIN
SELECT * FROM (VALUES('a'),('b')) AS tbl(t3);
END
GO
--Here starts your solution
--First we need tables to fill the SPs results into
--The column's names don't have to be the same as delivered from the SP...
DECLARE @t1 TABLE(t1x INT,t1y VARCHAR(100));
INSERT INTO @t1 EXEC dbo.Test1;
DECLARE @t2 TABLE(t1x VARCHAR(100),t2y VARCHAR(100),t3z INT);
INSERT INTO @t2 EXEC dbo.Test2;
DECLARE @t3 TABLE(t3x VARCHAR(100));
INSERT INTO @t3 EXEC dbo.Test3;
SELECT (SELECT * FROM @t1 FOR XML PATH('T1_Row'),ROOT('T1'),TYPE)
,(SELECT * FROM @t2 FOR XML PATH('T2_Row'),ROOT('T2'),TYPE)
,(SELECT * FROM @t3 FOR XML PATH('T3_Row'),ROOT('T3'),TYPE)
FOR XML PATH(''),ROOT('root')
GO
DROP PROCEDURE dbo.Test1;
DROP PROCEDURE dbo.Test2;
DROP PROCEDURE dbo.Test3;
结果完全相同,但更容易调用是这种带有标量函数的方法:
CREATE FUNCTION dbo.Test1()
RETURNS XML
AS
BEGIN
RETURN (SELECT * FROM (VALUES(1,'Test1_1'),(2,'Test1_2')) AS tbl(t1a,t1b) FOR XML PATH('T1_Row'),ROOT('T1'));
END
GO
CREATE FUNCTION dbo.Test2()
RETURNS XML
AS
BEGIN
RETURN (SELECT * FROM (VALUES('a','Test1_A',100),('b','Test1_B',200)) AS tbl(t2a,t2b,t2c) FOR XML PATH('T2_Row'),ROOT('T2'));
END
GO
CREATE FUNCTION dbo.Test3()
RETURNS XML
AS
BEGIN
RETURN (SELECT * FROM (VALUES('a'),('b')) AS tbl(t3) FOR XML PATH('T3_Row'),ROOT('T3'));
END
GO
SELECT (SELECT dbo.Test1())
,(SELECT dbo.Test2())
,(SELECT dbo.Test3())
FOR XML PATH(''),ROOT('root')
GO
DROP FUNCTION dbo.Test1;
DROP FUNCTION dbo.Test2;
DROP FUNCTION dbo.Test3;
两种情况的结果:
<root>
<T1>
<T1_Row>
<t1x>1</t1x>
<t1y>Test1_1</t1y>
</T1_Row>
<T1_Row>
<t1x>2</t1x>
<t1y>Test1_2</t1y>
</T1_Row>
</T1>
<T2>
<T2_Row>
<t1x>a</t1x>
<t2y>Test1_A</t2y>
<t3z>100</t3z>
</T2_Row>
<T2_Row>
<t1x>b</t1x>
<t2y>Test1_B</t2y>
<t3z>200</t3z>
</T2_Row>
</T2>
<T3>
<T3_Row>
<t3x>a</t3x>
</T3_Row>
<T3_Row>
<t3x>b</t3x>
</T3_Row>
</T3>
</root>