T-SQL - 使用存储过程数据的更简单方法

时间:2018-04-19 12:12:59

标签: sql sql-server tsql

我有一堆我一直打电话的存储过程。由于另一个使用它们的程序,我无法自行更改程序。他们中的大多数没有输出,但有类似的东西可以返回值:

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, ......

但是 - 这似乎不可能:(

关于如何更好地做到这一点的任何想法没有更改存储过程本身?

1 个答案:

答案 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