sql - 在 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)
解决方案
根据微软官方文档“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''''
推荐阅读
- c# - 将参数传递给 PostgreSQL 中的 Insert 语句
- javascript - 让 div 在点击外部时隐藏
- java - 类和对象,通过输入将旧值与新值相加,并将值传递给另一个对象~
- javascript - 使用超链接更改 style.display
- python - 用python识别句子中的副词
- java - Java, using Loop ask how many times something was repeated
- python-3.x - python3 + selenium - 遍历网站问题中的每个元素
- intellij-idea - 如何禁用新的 Angular 项目自动将文件添加到 git
- android - 某些 Android 设备中的 Firebase AUTHENTICATION_FAILED (java.io.IOException)
- image - 颤振:将jpg转换为webp