在OPENQUERY中使用IIF功能

时间:2015-05-12 02:57:50

标签: sql-server dynamic-sql linked-server iif 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驱动程序] [SQL Anywhere]' ='附近的语法错误在第1行和第34行。   准备查询" SELECT时发生错误   总和(IIf(左(代码,1)=' C',1,0))AS案件来自案件WHERE   cases.date_opened =' 20150511' "对OLE DB提供程序执行   " MSDASQL"对于链接服务器" LinkedServerName"。

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

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

3 个答案:

答案 0 :(得分:2)

我认为您使用的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'

修改

基于所罗巴伯的评论,他正在使用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'

答案 1 :(得分:0)

我认为此查询可以帮助您:

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

答案 2 :(得分:0)

我使用的SQL服务器不是旧的,我使用的是2014.它是链接服务器提供商MSDASQL,这是旧的。所以sqluser的答案很接近,ErikEJ的评论也很有帮助。我必须使用CASE而不是IIF。此查询有效。如果您更新,我会接受sqluser的回答。请注意,这个问题不仅仅是关于在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'