【问题标题】:Using IIF function in OPENQUERY在 OPENQUERY 中使用 IIF 函数
【发布时间】:2015-05-12 02:57:49
【问题描述】:
Declare @OPENQUERY nvarchar(500), @TSQL nvarchar(max), @LinkedServer nvarchar(20), @PickedDate varchar(8)

Set @LinkedServer = 'LinkedServerName'
Set @OPENQUERY = 'Select * From Openquery('+ @LinkedServer + ','''
Set @TSQL = 'SELECT sum(iif(left(code,1)=''''C'''', 1, 0) As ActiveCases
            From cases
            Where cases.date_opened = ''''' + @vcPickedDate + '''''
            '')'
Exec (@Openquery+@TSQL)

当我运行这个查询时,它返回了消息

“[Sybase][ODBC 驱动程序][SQL Anywhere]第 1 行 '=' 附近的语法错误”。 准备查询“SELECT”时出错 Sum(IIf(Left(code,1)='C',1,0)) AS Cases FROM cases WHERE case.date_opened = '20150511' " 用于针对 OLE DB 提供程序执行 链接服务器“LinkedServerName”的“MSDASQL”。

我认为这与 openquery 有关。如果我不使用 openquery 只运行以下查询,它就可以正常工作:

SELECT sum(iif(left(code,1)=''''C'''', 1, 0) As ActiveCases
                From cases
                Where cases.date_opened = ''''' + @vcPickedDate + '''''

【问题讨论】:

  • 我认为问题在于您使用了转义的单引号。
  • 您是否尝试过使用本机客户端 OLEDB 提供程序 - MSDASQL 是旧的(SQLNCLI12)?
  • 我必须为 ODBC 驱动程序使用 MSDASQL、OLEDB 提供程序。但是您的评论可以帮助我解决问题。谢谢埃里克。

标签: sql-server dynamic-sql linked-server iif openquery


【解决方案1】:

我认为您使用的 SQL Server 版本低于 2012,并且早期版本不支持 IIF

您可以改用CASE

SELECT Sum(CASE Left(matcode,1) WHEN 'R' THEN 1 ELSE 0 END) AS Cases
FROM cases
WHERE cases.date_opened = '20150511'

编辑

根据 Zerubbabel 的评论,他正在使用 SQL Server 2014,而问题在于使用 MSDASQL,它已经很老了,它不支持 IIF 功能。所以问题与 SQL Server 中的IIF 无关,而与OPENQUERY 无关。

SELECT Sum(CASE Left(code,1) WHEN ''''C'''' THEN 1 ELSE 0 END) AS Cases
FROM cases
WHERE cases.date_opened = '20150511'

【讨论】:

  • 不是我用的SQL服务器老了,我用的是2014的。可能是链接服务器提供者MSDASQL,老了。所以 sqluser 的答案很接近,ErikEJ 的评论也很有帮助。而且我必须使用 CASE 而不是 IIF。以下查询有效。如果你更新你的答案,我会接受 sqluser 的答案。请注意,这个问题不仅仅是关于在 SQL Server 中使用 IIF 的问题,而是在 Openquery 中使用它! SELECT Sum(CASE Left(code,1) WHEN ''''C'''' THEN 1 ELSE 0 END) AS Cases FROM cases WHERE cases.date_opened = '20150511'
  • 很高兴您找到了问题的正确答案。我编辑了我的答案。希望它对其他人有用。随意编辑它。不管你选择这个还是你的作为答案。
【解决方案2】:

我认为这个查询会对你有所帮助:

Set @TSQL = 'SELECT sum(iif(left(code,1)=''''C'''', 1, 0) As ActiveCases From cases
        Where cases.date_opened = '+''''''+@PickedDate+''''''+''')';

【讨论】:

  • 一点也不。 case.date_opened = ''''' + @vcPickedDate + ''''' 工作得非常好。你知道,你的查询打印出来的和我的一样。
【解决方案3】:

不是我使用的 SQL 服务器是旧的,我使用的是 2014。它是链接服务器提供程序 MSDASQL,它是旧的。所以 sqluser 的答案很接近,ErikEJ 的评论也很有帮助。而且我必须使用 CASE 而不是 IIF。下面的查询有效。请注意,这个问题不仅仅是关于在 SQL Server 中使用 IIF 的问题,而是在 openquery 中使用它。

SELECT Sum(CASE Left(code,1) WHEN ''''C'''' THEN 1 ELSE 0 END) AS Cases
FROM cases
WHERE cases.date_opened = '20150511'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    相关资源
    最近更新 更多