OPENQUERY(SERVER NAME, STORED PROCEDURE) 语法错误

OPENQUERY(SERVERNAME, STOREDPROCEDURE) Syntax error

这是我的代码

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

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

正在打印 @sql returns 格式正确的查询,但是 SQL 服务器不喜欢 @stringvariable 和 returns 一个错误

Msg 102, Level 15, State 1, Line 11
Incorrect syntax near 'Hello'.

这是输出查询的样子

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

如何避免这个错误?似乎是因为我的存储过程采用了一个字符串参数,所以它放弃了查询。我读到 OPENQUERY 不支持变量,但我已经为变量设置了参数,所以它应该可以工作?

感谢您的帮助!

存储过程存在于数据库和架构中。你需要提供那些。假设数据库 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 (!!) 个单引号……哎呀!使用相同数量的引号更新了原始部分。