繁体   English   中英

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

[英]T-SQL - Easier way to use stored procedure data

我有很多时候都在调用的存储过程。 由于其他程序正在使用这些程序,因此我无法更改它们本身。 他们中的大多数没有输出,但是有类似这样的东西来返回值:

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运行删除#ResultTable ),然后将其作为某种“汇总”数据推送到表中。 目的是让1个位置以指定的时间间隔读取数据,而不是从多个Web页反复运行存储过程。

我想比做的更简短(每个存储过程大约需要4行代码。我希望这样做:

INSERT INTO #FullResultsTable
    EXEC sp_Duration @ID, EXEC sp_GetID @Name, ......

但是-似乎不可能:(

关于在更改存储过程本身的情况下如何做得更好的任何想法?

您不能嵌套INSERT EXEC命令,例如

INSERT INTO #Table
EXEC procedure1
EXEC procedure2

只需在插入中运行第一个,然后作为独立命令运行第二个

INSERT INTO #Table
EXEC procedure1
UNION
EXEC procedure2

会在UNION上出错

如果要将所有数据放在一个表中,则可以运行多个INSERT INTO EXEC命令以填充同一表。 例如

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM