Sql 如何组合两个存储过程调用的结果集?
我有一个以下存储过程Sql 如何组合两个存储过程调用的结果集?,sql,sql-server,tsql,stored-procedures,union,Sql,Sql Server,Tsql,Stored Procedures,Union,我有一个以下存储过程 CREATE PROCEDURE [dbo].[MyStored] @state int AS SELECT blahblahblah WHERE StoredState=@state LotsOfJoinsFollow; RETURN 0 我想调用@state为0和1的存储过程,并将两个调用返回的结果集与UNION语义结合起来,这样我就有了一个新的结果集,其中包含第一个调用和第二个调用的行 类似于(想象中的SQL): 如何实现这一点?很长的一段路要走,那就是
CREATE PROCEDURE [dbo].[MyStored]
@state int
AS
SELECT blahblahblah WHERE StoredState=@state LotsOfJoinsFollow;
RETURN 0
我想调用@state为0
和1
的存储过程,并将两个调用返回的结果集与UNION
语义结合起来,这样我就有了一个新的结果集,其中包含第一个调用和第二个调用的行
类似于(想象中的SQL):
如何实现这一点?很长的一段路要走,那就是创建一个包装器来实现这一点——一个函数,它获取一个状态列表,并将它们添加到最终返回的表中 您还可以让调用此过程的任何技术执行记录浓缩(即,让.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
这对于简单的程序非常有效;尽管如此,如果以后需要进行更改,维护可能需要更长的时间
这里有一个a和一个a,它在细节方面做得更好
编辑:param@state需要是一个nVarChar,因为您传入了一个逗号分隔的int值列表这可能过于简化了问题,但是如果您控制了sp,只需使用in而不是=:
CREATE PROCEDURE [dbo].[MyStored]
AS
SELECT blahblahblah WHERE StoredState IN (0,1) LotsOfJoinsFollow;
RETURN 0
如果这不是一个选项,只需将两个存储过程调用的结果推送到临时表中:
/*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
除以下一系列陈述外:
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的两次调用的结果将被联合(或者,更确切地说,被联合调用),如果您正在调用的存储过程有一个与调用过程中的临时表同名的临时表,则会出现此错误 e、 g.sp1有临时表#结果 sp2创建表格#结果(字段)
然后尝试在sp2中插入#results,调用sp1的结果将失败,并出现此错误。将sp2中的temp表更改为#result并重试,您应该会看到它现在起作用了。将@state设置为逗号分隔的列表可以吗?(例如,state='0,1')-根据您的答案,解决方案会有所不同。@Ray K:我不确定,我更喜欢一个易于维护的解决方案。duplicate:StoredState可以有多少不同的值?如果您将逻辑移到TVF中,您可以将其作为2个选择的并集来执行。这仅在过程没有插入
时才有效,否则会出现错误:无法嵌套INSERT EXEC语句。
INSERT INTO #YourTempTable
EXEC MyStored 0;
INSERT INTO #YourTempTable
EXEC MyStored 1;
INSERT INTO #YourTempTable
EXEC ('
EXEC MyStored 0;
EXEC MyStored 1;
');