简体   繁体   English

在 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)

When I ran this query, it returned message当我运行此查询时,它返回消息

"[Sybase][ODBC Driver][SQL Anywhere]Syntax error near '=' on line 1". “[Sybase][ODBC 驱动程序][SQL Anywhere]第 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".准备查询“SELECT Sum(IIf(Left(code,1)='C',1,0)) AS Cases FROM cases WHERE cases.date_opened = '20150511'”以针对 OLE DB 提供程序“MSDASQL”执行时出错" 用于链接服务器“LinkedServerName”。

I figured this has something to do with openquery.我认为这与 openquery 有关。 It works fine if I simply run the following query without using openquery:如果我只运行以下查询而不使用 openquery,它就可以正常工作:

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

I think the version of SQL Server you are using is under 2012 and IIF is not supported for earlier versions.我认为您使用的 SQL Server 版本低于 2012 并且早期版本不支持IIF

You can use CASE instead.您可以改用CASE

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

Edit编辑

Based on Zerubbabel comment, he is using SQL Server 2014 and the problem was for using MSDASQL which is quite old and it doesn't support IIF function.根据 Zerubbabel 评论,他使用的是SQL Server 2014 ,问题是使用MSDASQL ,它很旧,不支持IIF功能。 So the problem has nothing to do about IIF in SQL Server but in OPENQUERY .所以这个问题与 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'

I think this query will help you :我认为这个查询会帮助你:

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

It's not the SQL server I am using that is old, I use 2014. It's the linked server provider MSDASQL, which is old.我使用的不是旧的 SQL 服务器,我使用的是 2014 年。它是旧的链接服务器提供程序 MSDASQL。 So sqluser's answer is close and ErikEJ's comment is helpful too.所以 sqluser 的回答很接近,ErikEJ 的评论也很有帮助。 And I do have to use CASE instead of IIF.而且我必须使用 CASE 而不是 IIF。 The query below works.下面的查询有效。 NOTE that this question is not simply about issue using IIF in SQL server, but using it in an openquery .请注意,这个问题不仅仅是关于在 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'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM