小编Zok*_*otz的帖子

当SP包含#temp表时,使用OPENROWSET动态检索SP结果

我的情景

我正在开发一个数据库,该数据库将包含整个服务器上不同数据库中各种存储过程的许多详细信息.我现在试图收集的信息是"SP输出什么?"

在搜索中我发现答案在于OPENROWSET.我的初步测试成功,一切看起来都很棒.但是,在使用实时SP进行测试后,我遇到了一个主要问题:它与temp(#)表不兼容.

例如:

如果我要拿这个SP:

CREATE PROCEDURE dbo.zzTempSP(@A INT, @B INT) AS
SELECT @A AS A, @B AS B
Run Code Online (Sandbox Code Playgroud)

我可以使用以下代码轻松地将输出插入到临时(##)表中,然后查询tempdb的sysobjects并生成列及其数据类型的列表:

IF OBJECT_ID('tempdb.dbo.##TempOutput','U') IS NOT NULL DROP TABLE ##TempOutput

DECLARE @sql VARCHAR(MAX)
SELECT @sql = 'SELECT * 
               INTO ##TempOutput
               FROM OPENROWSET(''SQLNCLI'', ''Server=' + 
        CONVERT(VARCHAR(100), SERVERPROPERTY('MachineName')) +
                             ';Trusted_Connection=yes;'', ''SET FMTONLY OFF exec ' + 
                               DB_NAME() + 
                              '.dbo.zzTempSP @A=1, @B=2'')'
EXEC(@sql)

SELECT *
FROM ##TempOutput
Run Code Online (Sandbox Code Playgroud)

大!但是,如果SP是这样的:

CREATE PROCEDURE dbo.zzTempSP (@A INT, @B INT) AS CREATE TABLE dbo.#T (A INT, B INT)

INSERT INTO …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server dynamic-sql openrowset

10
推荐指数
1
解决办法
2万
查看次数

标签 统计

dynamic-sql ×1

openrowset ×1

sql ×1

sql-server ×1

t-sql ×1