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 (!!) 个单引号……哎呀!使用相同数量的引号更新了原始部分。
这是我的代码
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 (!!) 个单引号……哎呀!使用相同数量的引号更新了原始部分。