- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个数据库,该数据库将包含整个服务器上不同数据库中各种存储过程的许多详细信息。我现在试图收集的信息是“SP 输出什么?”
在搜索中我发现答案就在 OPENROWSET 中。我的初步测试很成功,一切看起来都很棒。然而,在使用实时 SP 对其进行测试时,我遇到了一个主要问题:它不能很好地与临时 (#) 表配合使用。
例如:
如果我要接受这个 SP:
CREATE PROCEDURE dbo.zzTempSP(@A INT, @B INT) AS
SELECT @A AS A, @B AS B
我可以使用以下代码轻松地将输出插入到临时 (##) 表中,然后查询 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
太棒了!但是,如果 SP 是这样的:
CREATE PROCEDURE dbo.zzTempSP (@A INT, @B INT) AS CREATE TABLE dbo.#T (A INT, B INT)
INSERT INTO dbo.#T
SELECT @A AS A, @B AS B
SELECT *
FROM dbo.#T
当我执行与之前相同的 OPENROWSET
代码时,我收到以下错误:
Cannot process the object "SET FMTONLY OFF exec DatabaseName.dbo.zzTempSP @A=1,@B=2". The OLE DB provider "SQLNCLI10" for linked server "(null)" indicates that either the object has no columns or the current user does not have permissions on that object.
当我将 OPENROWSET 代码(通过删除动态内容)修剪为:
SELECT *
FROM OPENROWSET('SQLNCLI','Server=ServerName;Trusted_Connection=yes;',
'exec DatabaseName.dbo.zzTempSP @A=1,@B=2'
)
我收到以下(更有用的)错误:
Invalid object name '#T'.
这就是我碰壁的地方。在我的搜索中似乎没有解决办法,但我还不能让自己放弃它。
所以我被引导到..
有人知道有什么可能的方法来规避这个错误吗?或者有其他解决方案吗?
这个过程不会经常运行,所以我不必太担心解决方案的效率。
任何意见都将不胜感激。
谢谢,佐克
PS:抱歉格式问题。我不太明白语言标签。
最佳答案
我也在 SQL Server Central 上发布了这个问题,一些回复让我又开始在 OPENROWSET 中寻找答案(并找到它)。其中一个人向我求助 this article有关 OPENQUERY 的部分。它指出,为了解决临时表的问题,您只需将 SET FMTONLY OFF 添加到 OPENQUERY/OPENROWSET 语句的执行行,如下所示:
SELECT *
FROM OPENROWSET( 'SQLNCLI',
'Server=SERVERNAME;Trusted_Connection=yes;',
'SET FMTONLY OFF; exec DatabaseName.dbo.zzTempSP @A=1,@B=2'
)
但是,如果该过程未指定 SET NOCOUNT ON,它仍然会引发错误。我对 SET NOCOUNT ON 有一个愚蠢的误解,这让我无法思考:“嘿,我不能将 SET NOCOUNT ON 添加到 OPENROWSET 的执行语句中吗?”一旦有人在另一个线程上向我问了这个问题,它就太有意义了 =) 所以,这是我一直在寻找的解决方案:
SELECT *
FROM OPENROWSET( 'SQLNCLI',
'Server=SERVERNAME;Trusted_Connection=yes;',
'SET FMTONLY OFF; SET NOCOUNT ON; exec DatabaseName.dbo.zzTempSP @A=1,@B=2'
)
关于sql - 当 SP 包含 # 个临时表时,使用 OPENROWSET 动态检索 SP 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7826557/
我尝试查询在其他服务器中组合 3 个表的结果。我的查询正在运行,但需要很长时间才能获得结果(2 分钟)。任何人都可以帮助我重组查询以使其快速。我不能为此使用链接服务器。以下是我的查询: DECLARE
使用 SQL Server 2016。 我正在尝试使用 OPENROWSET 读取 Excel 文件。这完美地工作: SELECT * FROM OPENROWSET('Microsoft.ACE.O
我想构造与 OPENROWSET 方法一起使用的查询。 例子: SELECT * FROM OPENROWSET ('SQLOLEDB', 'srv'; 'login'; 'mdp'; 'SELECT
我们可以写这样的查询吗 INSER TNTO Customers SELECT * FROM OPENROWSET( 'SQLNCLI', Remote Server Settings , 'SELE
我正在使用以下命令将数据加载到 SQL Server 中: INSERT INTO [NewTable] SELECT * FROM OPENROWSET ( 'MSDASQL', 'Driver={
我正在尝试导入具有数字和字母数字值的列(来自 .csv 文件),但是当我运行 openrowset 过程时,它会正确导入数字行,但对于字母数字值,它默认为 null. A 表 ID,A,B,C 1,1
我正在浏览 azure 文档并遇到以下短语 OPENROWSET function in Synapse SQL reads the content of the file(s)from a data
我正在尝试在 SQL Openrowset 命令中使用变量文件路径。我知道它无法显式接受变量,并且我需要使用动态 SQL。 目前有效的方法 - SELECT @file_stream = CAST(b
我试图将变量传递到 OPENROWSET 中的 SELECT 语句中,但我不断收到错误 DECLARE @dDateTIME DATE SET @dDateTIME = (SELECT SalesDa
我在执行此查询时遇到问题: SELECT * FROM OPENROWSET( 'SQLNCLI', 'DRIVER={SQL Server};', 'EXEC dbo.sPr
使用方法 OpenRowSet 将数据插入空白文件? 我需要从数据库中插入一个 txt 文件(比如 D:\TDB)一些选择输出(比如 select * from sys.tables) INSERT
我正在转换 EXCEL 文件中包含的一些数据,我正在使用 OPENROWSET 来执行此操作。我可以通过 select * 获取数据类型语法,但我没有在结果中返回任何列名。 在这种情况下,结果是我想使
我花了一整天的时间试图解决这个问题,并准备好寻求帮助。 我正在尝试让以下代码正常工作。 (由于显而易见的原因,用户和通行证被省略)我正在从 SSMS 运行查询,并希望获取存储过程的内容并将其放入临时表
有没有办法在 SQL Server 2008 R2 中使用 OpenRowSet 和 OpenDataSet 命令而无需具有系统管理员权限? 我正在尝试从 Excel 文件加载数据,而我们执行实际加载
我最近才开始使用 OPENROWSET 将图像插入到表格中。以前,我会指定每个图像的路径(1 个图像 = 1 个 INSERT 语句),并使用 PHP 生成图像的二进制字符串: INSERT INTO
我有这个查询,我想做的是从另一台服务器执行存储过程来获取结果。 我需要在 sp 中传递一个参数。 我的问题是它不起作用,我不知道我必须做什么才能让它发挥作用。 希望有人能帮我解决这个问题。 这是我的代
目标 使用 OPENROWSET 功能在针对文本文件的查询中加入数据。 错误 利用 @gbn 在 this question 上的回答,我正在尝试像 OP 一样打开一个行集;虽然文件的格式有点不同。但
我想执行简单的语句: SELECT * FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Text;Database=C:\Temp\;','SELECT * FR
我正在尝试运行以下语句: INSERT INTO table SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0; Dat
是否有计划支持专用池的开放行集?优点: 比外部文件格式更多(更快)的解析器选项,例如行分隔符 可以自动推断模式 直接定义文件格式更方便 最佳答案 这是一个很棒的功能请求,安德斯。我看到您已经创建了一个
我是一名优秀的程序员,十分优秀!