【问题标题】:OPENQUERY(SERVERNAME, STOREDPROCEDURE) Syntax errorOPENQUERY(SERVER NAME, STORED PROCEDURE) 语法错误
【发布时间】:2016-02-22 22:18:41
【问题描述】:

这是我的代码

DECLARE @stringvariable nvarchar(200) = 'Hello';

DECLARE @sql nvarchar(2000) = SELECT * INTO ##global FROM OPENQUERY(DB1, ''EXEC GETCASE ''' + @stringvariable + ''''')'

打印 @sql 返回格式正确的查询,但是 SQL Server 不喜欢 @stringvariable 并返回错误

消息 102,第 15 级,状态 1,第 11 行
'Hello' 附近的语法不正确。

这是输出查询的样子

SELECT * INTO ##global FROM OPENQUERY(DB1, 'EXEC GETCASE 'Hello'')

如何避免此错误?似乎因为我的存储过程需要一个字符串参数,所以它会抛出查询。我读过OPENQUERY 不支持变量,但是我已经为变量设置了参数,所以它应该可以工作吗?

感谢您的帮助!

【问题讨论】:

标签: sql sql-server-2008 openquery


【解决方案1】:

存储过程存在于数据库和架构中。你需要提供这些。假设数据库db_name 和架构schema_name

DECLARE @stringvariable nvarchar(200) = 'Hello';
SET @stringvariable=REPLACE(@stringvariable,'''',''''''''''); -- doubly doubled single quotes for the dynamic statement
DECLARE @sql nvarchar(2000) = 'SELECT * INTO ##global FROM OPENQUERY(DB1, ''SET FMTONLY OFF;EXEC db_name.schema_name.GETCASE ''''' + @stringvariable + ''''''')';

我还确保在 @stringvariable 中正确转义了单引号。

您也可能需要以 SET FMTONLY OFF; 开始查询,所以我添加了它。


更新:为了测试这一点,我在数据库 TEST_TT 中的链接服务器 local_server 上创建了以下简单过程

CREATE PROCEDURE [dbo].[tst]
    @i VARCHAR(128)
AS
    SELECT @i AS field;

然后我运行了以下内容:

DECLARE @var VARCHAR(128)='TT.';
SET @var=REPLACE(@var,'''',''''''''''); -- doubly doubled single quotes for the dynamic statement
DECLARE @stmt VARCHAR(4000)='SELECT * INTO ##tt FROM OPENQUERY(local_server,''SET FMTONLY OFF;EXEC TEST_TT.dbo.tst '''''+@var+''''''');';
EXEC (@stmt);
SELECT * FROM ##tt;
DROP TABLE ##tt;

我收到了结果。我在查询的末尾数了 7 个(!!)单引号……哎呀!用相同数量的引号更新了原始部分。

【讨论】:

  • 您好 TT 感谢您的回复,我正在使用 dbname 和架构名称,但我没有在 Stackoverflow 代码中添加它。我遵循了您的格式,但仍然遇到相同的错误。打印出来的输出和以前一样(除了现在显示'SET FMTONLY OFF;')
  • @GovindRai 更新了一些可以在我的系统上运行的东西(2012 年)。
  • @GovindRai 更改了变量中的单引号。动态 SQL 会变得丑陋 =)
  • 嗨 TT。感谢您的更新!我想我确实对您的回答更进一步,但现在我得到了一个用于链接服务器“XXXXX”的“旧数据库提供程序”“SQLNCLT11”,它为列提供了不一致的元数据。报告“COLUMX”列具有“不完整的架构错误逻辑”
  • @MichaelFreidgeim 很久以前(至少 10 多年前),我遇到过一个需要这样做的案例。我已经不记得当时的情况了。正如我所说的,也许它并不是特别需要。
猜你喜欢
  • 2016-05-13
  • 1970-01-01
  • 2022-12-27
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多