2015-05-12 3 views
1
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 (@[email protected]) 

Когда я запустил этот запрос, он возвратил сообщениеИспользование функции IIF в OPENQUERY

"[Sybase] [ODBC Driver] [SQL Anywhere] Ошибка синтаксиса около '=' в строке 1". Произошла ошибка при подготовке запроса «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 + ''''' 
+0

Я думаю, что проблема связана с использованием одиночных кавычек. – Dai

+0

Вы пытались использовать собственный клиент OLEDB-провайдера - MSDASQL является старым (SQLNCLI12)? – ErikEJ

+0

Я должен использовать MSDASQL, поставщик OLEDB для драйверов ODBC. Но ваш комментарий помогает мне решить проблему. Спасибо Эрик. – Zerubbabel

ответ

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 функцию. Таким образом, проблема не имеет ничего общего с IIF в SQL Server, но в OPENQUERY.

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

Это не тот SQL-сервер, который я использую, старый, я использую 2014. Вероятно, это уже связанный сервер MSDASQL, старый. Поэтому ответ sqluser близок, и комментарий ErikEJ тоже полезен. И мне нужно использовать CASE вместо IIF. Выполняется следующий запрос. Я соглашусь ответить sqluser, если вы обновите свой. Обратите внимание, что этот вопрос касается не просто проблемы с использованием IIF на SQL-сервере, но использования его в Openquery! SELECT SUM (CASE левый (код, 1), КОГДА '' '' C '' '' THEN 1 ELSE 0 END) AS Случаи FROM случаев WHERE cases.date_opened = '20150511' – Zerubbabel

+0

Это хорошо вы нашли правильный ответ для вашего вопроса. Я отредактировал свой ответ. Надеюсь, это может быть полезно для кого-то другого. Не стесняйтесь редактировать его. Неважно, если вы выберете этот или ваш ответ. – sqluser

+0

Спасибо, sqluser. Я принял ваш отредактированный ответ. И да, нижняя линия, надеюсь, это также может быть полезно и для других. – Zerubbabel

0

Я думаю, что этот вопрос поможет вам:

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

Совсем нет. Где случаи.date_opened = '' '' '+ @vcPickedDate +' '' '' отлично работает. Так что вы знаете, ваш запрос распечатывается так же, как и мой. – Zerubbabel

0

Это не сервер SQL Я использую это старый, я использую 2014. Это связанный сервер провайдера MSDASQL, что старый. Поэтому ответ sqluser близок, и комментарий ErikEJ тоже полезен. И мне нужно использовать CASE вместо IIF. Этот запрос работает. Я соглашусь ответить sqluser, если вы обновите свой. Обратите внимание, что этот вопрос касается не только проблемы с использованием IIF на SQL-сервере, но и использования его в Openquery!

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

Может быть, использовать Синоним проще ?! – Zerubbabel