首页 > 解决方案 > 在 SQL Server 的打开查询语句中使用参数

问题描述

我想在下面的 sql open 查询语句中使用 sql 参数。但它让我犯了错误的语法。我不熟悉如何使用单引号作为参数。

select * from openquery(MYSQL_FIS,'
SELECT 
CASE WHEN CUSTOMER.CUSTOMERID = ''abc'' THEN ''abcd'' ELSE CASE WHEN PARTICIPANT = 1 THEN ''Market'' ELSE ''Customers'' END END as AccountNo,
''Investment'' Account_Name,
cast(SUM(FACEVALUE)as decimal(38,6)) Amount
FROM DEAL, CUSTOMER 
WHERE DEAL.DEALTYPECODE IN (''R'')
AND DEAL.CUSTOMERID = CUSTOMER.CUSTOMERID AND DEAL.SUBACCOUNTID = CUSTOMER.SUBACCOUNTID
AND MATURITYDATE >= date_add(''' + @DatePara2 +''' ,Interval 1 Day)
AND STATUS != ''C''
AND STATUS != ''E'' 
AND STATUS != ''T''
AND STATUS != ''Q''
AND VALUEDATE < date_add(''' + @DatePara2 + ''',Interval 1 Day)
GROUP BY DEALTYPECODE,
CASE WHEN CUSTOMER.CUSTOMERID = ''C'' THEN ''C'' ELSE CASE WHEN PARTICIPANT = 1 THEN ''Market Participant'' ELSE ''Customers'' END END
)) FIS
group by AccountNo)

标签: sqlsql-servertsql

解决方案


根据微软官方文档“OPENQUERY 不接受其参数的变量”。这意味着您也不能在函数内部进行连接 - 我猜它不会在第一个结束引号之后解析任何内容。

您需要使用EXEC中的整个语句才能使其正常工作:

EXEC ('select * from openquery(MYSQL_FIS,''...

')

并且您需要在 openquery 中的任何地方加倍引号,因为整个内容需要在 EXEC 中的引号之间,并且您需要再次转义(注意我在链接服务器名称之后放置查询字符串的初始 2 个单引号),所以例如

CASE WHEN CUSTOMER.CUSTOMERID = ''CC00001'' THEN ''CBSL''

应该成为

CASE WHEN CUSTOMER.CUSTOMERID = ''''CC00001'''' THEN ''''CBSL''''

推荐阅读