如何组合来自两个存储过程调用的结果集?

时间:2011-12-29 15:27:22

标签: sql sql-server tsql stored-procedures union

我有以下存储过程

CREATE PROCEDURE [dbo].[MyStored]
   @state int
AS
   SELECT blahblahblah WHERE StoredState=@state LotsOfJoinsFollow;
RETURN 0

我想调用@state为01的存储过程,并将两个调用返回的结果集与UNION语义相结合,这样我就有了新结果集,包含第一次调用和第二次调用的行。

像(假想的SQL):

(EXEC MyStored 0) UNION (EXEC MyStored 1);

我如何实现这一目标?

5 个答案:

答案 0 :(得分:14)

这可能过分简化了问题,但是如果你可以控制sp,只需使用in而不是=:

CREATE PROCEDURE [dbo].[MyStored]
AS
   SELECT blahblahblah WHERE StoredState IN (0,1) LotsOfJoinsFollow;
RETURN 0

如果这不是一个选项,只需将两个sproc调用的结果推送到临时表:

/*Create a table with the same columns that the sproc returns*/
CREATE TABLE #tempblahblah(blahblahblah NVARCHAR(50))

INSERT #tempblahblah ( blahblahblah )
 EXEC MyStored 0

INSERT #tempblahblah ( blahblahblah )
 EXEC MyStored 1

SELECT * FROM #tempblahblah

答案 1 :(得分:5)

create table #table ( 
    .....
)

insert into #table exec MyStored 0
insert into #table exec MyStored 1

select * from #table

drop table #table

答案 2 :(得分:3)

除了这样的一系列陈述之外:

INSERT INTO #YourTempTable
EXEC MyStored 0;
INSERT INTO #YourTempTable
EXEC MyStored 1;

您可以使用下面的一个INSERT ... EXEC语句:

INSERT INTO #YourTempTable
EXEC ('
  EXEC MyStored 0;
  EXEC MyStored 1;
');

MyStored的两次调用的结果将是UNIONed(或者更确切地说,UNION ALLed),就像使用前一种方法一样。

答案 3 :(得分:1)

很长一段时间是创建一个执行此操作的包装器 - 一个获取状态列表并将它们添加到将返回的最终表的函数。

您也可以使用任何技术调用此过程进行记录的连接(即让.NET附加您正在查看的每个州的结果集)

如果将状态列表传递给'state'参数就可以了,可以创建动态sql查询

CREATE PROCEDURE [dbo].[MyStored]
   @state nvarchar(150)
AS

-- @state needs to be pre-formatted in a list for an in-clause  
--    i.e. 1,2,10   (if it was a string list, you'd need to do use double single quotes around the items - ''1'',''2'',''10''

DECLARE @SQL nVarChar(5000) = '
   SELECT blahblahblah 
   FROM LotsOfJoins
   WHERE StoredState in (' + @state + ')'


exec sp_executeSql @sql

这对于简单的程序非常有用;但是,如果需要在路上进行更改,可能需要更长的时间来维护。

以下是CodeProject ArticleMS SQL Tips Article,可以更好地了解详细信息

编辑:param @state需要是一个nVarChar,因为你传入一个以逗号分隔的int值列表

答案 4 :(得分:0)

如果您调用的存储过程的临时表与调用过程中的临时表同名,则会出现此错误。

e.g。 sp1有临时表#results

sp2 create table #results(fields) 然后尝试插入sp2中的#results,调用sp1的结果将失败并显示此错误。将sp2中的临时表更改为#result并再次尝试,您应该看到现在可以正常工作。