OPENQUERY(SERVERNAME,STOREDPROCEDURE)语法错误

时间:2016-02-22 22:18:41

标签: sql sql-server-2008 openquery

这是我的代码

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

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

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

  

Msg 102,Level 15,State 1,Line 11
  ' Hello'附近的语法不正确。

以下是输出查询的内容

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

如何避免此错误?这似乎是因为我的存储过程采用字符串参数,它抛弃了查询。我已经读过OPENQUERY不支持变量,但是我已经对变量进行了参数设置,因此它应该有效吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

存储过程存在于数据库和模式中。你需要提供这些。假设数据库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;启动查询,所以我已经添加了。

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

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(!!)单引号...哎呀!使用相同数量的引号更新原始部件。