Utilisation de la fonction IIF dans 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) 

Lorsque j'ai exécuté cette requête, elle a renvoyé un message

"[Sybase] [Pilote ODBC] [SQL Anywhere] Erreur de syntaxe près de '=' sur la ligne 1". Une erreur est survenue lors de la préparation de la requête "SELECT Somme (IIf (gauche (code, 1) = 'C', 1,0)) Cas AS FROM cas où cas.date_opened = '20150511'" pour l'exécution sur le fournisseur OLE DB "MSDASQL "pour le server lié" LinkedServerName ".

Je pensais que cela avait quelque chose à voir avec openquery. Cela fonctionne très bien si je lance simplement la requête suivante sans utiliser openquery:

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

Je pense que la version de SQL Server que vous utilisez est sous 2012 et IIF n'est pas pris en charge pour les versions antérieures.

Vous pouvez utiliser CASE place.

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

modifier

Basé sur le commentaire de Zerubbabel, il utilise SQL Server 2014 et le problème était d'utiliser MSDASQL qui est assez ancien et ne supporte pas la fonction IIF . Le problème n'a donc rien à voir avec IIF dans SQL Server mais dans OPENQUERY .

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

Je pense que cette requête va vous aider:

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

Ce n'est pas le server SQL que j'utilise qui est ancien, j'utilise 2014. C'est le fournisseur de server lié MSDASQL, qui est ancien. Donc la réponse de sqluser est proche et le commentaire d'ErikEJ est utile aussi. Et je dois utiliser CASE au lieu de IIF. Cette requête fonctionne. Je vais accepter la réponse de sqluser si vous mettez à jour le vôtre. Notez que cette question ne concerne pas simplement l'utilisation de IIF dans le server SQL, mais l'utilisation de celle-ci dans Openquery!

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