在 OPENQUERY 中使用 IIF 函数

Using IIF function in OPENQUERY

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 Driver][SQL Anywhere]Syntax error near '=' on line 1". An error occurred while preparing the query "SELECT Sum(IIf(Left(code,1)='C',1,0)) AS Cases FROM cases WHERE cases.date_opened = '20150511' " for execution against OLE DB provider "MSDASQL" for linked server "LinkedServerName".

我认为这与 openquery 有关。如果我在不使用 openquery 的情况下简单地 运行 以下查询,它工作正常:

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

我认为您使用的 SQL 服务器版本低于 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 服务器中的 IIF 无关,而是 OPENQUERY.

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

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

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

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

中使用它的问题
SELECT Sum(CASE Left(code,1) WHEN ''''C'''' THEN 1 ELSE 0 END) AS Cases
FROM cases
WHERE cases.date_opened = '20150511'