我有一堆我一直打电话的存储过程。由于另一个使用它们的程序,我无法自行更改程序。他们中的大多数没有输出,但有类似的东西可以返回值:
SELECT Duration = dbo.fn_Duration(@intPD, @dtmStart, dtmEnd, null)
目前我正在接受每个存储过程并将其返回到这样的表中:
CREATE TABLE #ResultTable(ret float)
INSERT INTO #ResultTable
EXEC sp_Duration @ID
SELECT @Duration = ret
FROM #ResultTable
现在 - 因为我有13个存储过程,我一遍又一遍地执行此操作(以及从#ResultTable
运行删除)然后将其推送到表中,作为一种“累积”数据。目的是让一个位置以指定的间隔读取数据,而不是从多个网页上反复运行存储过程。
我想比我做的更简单(每个存储过程大约有4行代码。我希望这样做更像:
INSERT INTO #FullResultsTable
EXEC sp_Duration @ID, EXEC sp_GetID @Name, ......
但是 - 这似乎不可能:(
关于如何更好地做到这一点的任何想法没有更改存储过程本身?
答案 0 :(得分:0)
您无法嵌套INSERT EXEC
个命令,例如
INSERT INTO #Table
EXEC procedure1
EXEC procedure2
只会在插入中运行第一个,然后将第二个作为独立命令运行,同样
INSERT INTO #Table
EXEC procedure1
UNION
EXEC procedure2
会在UNION
如果您想要一个表中的所有数据,那么您可以运行多个INSERT INTO EXEC
命令来填充同一个表。 e.g。
CREATE PROCEDURE #TEST1 AS
(
SELECT 1
)
GO
CREATE PROCEDURE #TEST2 AS
(
SELECT 1
)
GO
CREATE PROCEDURE #TEST3 AS
(
SELECT 1
)
GO
CREATE TABLE #TESTTABLE (ID INT)
INSERT INTO #TESTTABLE
EXEC #TEST1
INSERT INTO #TESTTABLE
EXEC #TEST2
INSERT INTO #TESTTABLE
EXEC #TEST3
SELECT * FROM #TESTTABLE
DROP PROCEDURE #TEST1
DROP PROCEDURE #TEST2
DROP PROCEDURE #TEST3
DROP TABLE #TESTTABLE
这将返回结果:
ID
1
1
1