这是我的代码
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
不支持变量,但是我已经对变量进行了参数设置,因此它应该有效吗?
感谢您的帮助!
答案 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(!!)单引号...哎呀!使用相同数量的引号更新原始部件。