Sql 当SP包含临时表时,使用OPENROWSET动态检索SP结果 我的情景

Sql 当SP包含临时表时,使用OPENROWSET动态检索SP结果 我的情景,sql,sql-server,tsql,dynamic-sql,openrowset,Sql,Sql Server,Tsql,Dynamic Sql,Openrowset,我正在开发一个数据库,它将包含整个服务器上不同数据库中不同存储过程的许多细节。我现在试图收集的信息是,SP的输出是什么 在搜索中,我发现答案在于OPENROWSET。我最初的测试是成功的,一切看起来都很好。然而,在使用live SPs进行测试时,我遇到了一个主要问题:它不能很好地与临时表配合使用 例如: 如果我要使用此SP: 创建过程dbo。zzTempSP@AINT,@B INT作为 选择@A作为A,选择@B作为B 我可以使用以下代码轻松地将输出插入临时表,然后查询tempdb的sysobje

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

在搜索中,我发现答案在于OPENROWSET。我最初的测试是成功的,一切看起来都很好。然而,在使用live SPs进行测试时,我遇到了一个主要问题:它不能很好地与临时表配合使用

例如:

如果我要使用此SP:

创建过程dbo。zzTempSP@AINT,@B INT作为 选择@A作为A,选择@B作为B 我可以使用以下代码轻松地将输出插入临时表,然后查询tempdb的sysobjects并生成列及其数据类型的列表:

如果对象_ID'tempdb.dbo.TempOutput','U'不是空的DROP TABLE TEMPOUT 声明@sql VARCHARMAX 选择@sql=”选择* 转换为临时输出 从OPENROWSETSQLNCLI,服务器='+ CONVERTVARCHAR100,服务器属性'MachineName'+ ';可信连接=是;,设置FMTONLY OFF exec'+ DB_名称+ “.dbo.zzTempSP@A=1,@B=2” EXEC@sql 挑选* 从临时输出 太好了!但是,如果SP为,则改为:

创建过程dbo.zzTempSP@A INT,@B INT作为创建表dbo.T A INT,B INT 插入到dbo.T中 选择@A作为A,选择@B作为B 挑选* 来自dbo.T 当我执行与之前相同的OPENROWSET代码时,我收到以下错误:

无法处理对象集FMTONLY OFF exec DatabaseName.dbo.zzTempSP@A=1、@B=2。链接服务器null的OLE DB提供程序SQLNCLI10表示该对象没有列,或者当前用户对该对象没有权限

当我通过删除动态内容来精简OPENROWSET代码时:

挑选* 从OPENROWSET'SQLNCLI','Server=ServerName;受信任的_连接=是;', 'exec DatabaseName.dbo.zzTempSP@A=1,@B=2' 我收到以下更有用的错误:

无效的对象名称“T”

这就是我碰壁的地方。在我的搜索中,似乎没有解决办法,但我还不能让自己放弃它

于是我被带到

我向你提出的问题 有没有人知道有什么方法可以避免这个错误?或者有没有其他的解决办法

这个过程不会经常运行,所以我不必太担心解决方案的效率

如有任何意见,将不胜感激

谢谢, 佐克


PS:很抱歉格式化了。我没有完全弄清楚语言标签。

好的。。我放弃了,回到了我的老朋友xpcmdshell身边。在整个响应及其代码中,xpcmdshell将隐含下划线,因为我通常无法加载包含全名的页面

首先,这里是我尝试过的三件不起作用的事情,其他的我都记不起来了:

不计较 适用于没有临时表的任何SP,但由于2500+中的大多数,我将仔细研究如何利用它们,这是不可行的。 无操作 我创建了一个过程来动态创建一个No-Op,但是在实现时,我无法找到一种方法来解决SQL陷入嵌套循环的问题。 bcp查询 输出不包括标题 所以,在经历了大量的抨击和谷歌搜索之后,我又回到了xpcmdshell。下面的脚本将转换为一个过程,它接受一个SP exec语句和运行它的数据库,将xpcmdshell sqlquery命令格式化为一个文件,执行该文件并将其输出插入一个临时表,然后将这些结果的列标题提取到另一个临时表中

不计较 声明@TempCmdPath VARCHARMAX, @程序REEXEC VARCHARMAX, @数据库名VARCHAR255 选择@TempCmdPath='C:\Temp\'-确保路径以“\”结尾,如果缺少,则添加要追加的逻辑 选择@ProcedureExec='exec dbo.crp_rpt_GetCustomerDetails@ShowContacts=0,@CustomerName=cust123%'-确保将单引号加倍' 选择@ProcedureExec=REPLACE@ProcedureExec,-在xpcmdshell sqlquery命令中使用“再次将单引号加倍” 选择@DatabaseName='CorpDB' 如果对象_ID'tempdb.dbo.CmdOut','U'不为空 删除表dbo.CmdOut 创建表dbo.CmdOut id INT IDENTITY1,1,-在行数函数中用于更新rid rid INT,-在WHILE循环中使用的实际数字 瓦尔恰马克斯线路图 声明@cmdshell VARCHARMAX /*使用要运行的命令创建一个文件*/ 选择@cmdshell='exec master.dbo.xpcmdshell sqlcmd' +替换'-q PRINT:error'+@TempCmdPath+'TempSqlCmdOut.txt'-将错误设置为指向文本文件 +'PRINT'+@ProcedureExec++'-添加其他打印语句以包含更多
SELECT  *
FROM    OPENROWSET( 'SQLNCLI',
                    'Server=SERVERNAME;Trusted_Connection=yes;',
                    'SET FMTONLY OFF; exec DatabaseName.dbo.zzTempSP @A=1,@B=2'
                  )
SELECT  *
FROM    OPENROWSET( 'SQLNCLI',
                    'Server=SERVERNAME;Trusted_Connection=yes;',
                    'SET FMTONLY OFF; SET NOCOUNT ON; exec DatabaseName.dbo.zzTempSP @A=1,@B=2'
                  )