我有以下存储过程
CREATE PROCEDURE [dbo].[MyStored]
@state int
AS
SELECT blahblahblah WHERE StoredState=@state LotsOfJoinsFollow;
RETURN 0
我想调用@state为0
和1
的存储过程,并将两个调用返回的结果集与UNION
语义相结合,这样我就有了新结果集,包含第一次调用和第二次调用的行。
像(假想的SQL):
(EXEC MyStored 0) UNION (EXEC MyStored 1);
我如何实现这一目标?
答案 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 Article和MS SQL Tips Article,可以更好地了解详细信息
编辑:param @state需要是一个nVarChar,因为你传入一个以逗号分隔的int值列表
答案 4 :(得分:0)
如果您调用的存储过程的临时表与调用过程中的临时表同名,则会出现此错误。
e.g。 sp1有临时表#results
sp2 create table #results(fields) 然后尝试插入sp2中的#results,调用sp1的结果将失败并显示此错误。将sp2中的临时表更改为#result并再次尝试,您应该看到现在可以正常工作。