2016-07-26 6 views
0

Я пытаюсь выполнить следующий запрос, чтобы проверить записи из 4 таблиц, а затем вызвать функцию, но я получаю сообщение об ошибке рядом с скобками. Он работает нормально, если я использую случай, но выходит, когда выполняется первое условие. Мне нужно, чтобы оценить для всех таблиц в 4 ИФ:если существует в sql в подзапросе

select account_id, 
     (
     if exists (select account_id from [dbo].[TEST_R6]) 
     Begin 
     select dbo.make_indicator(cent,chem,co,dim,lg,pl,strs,vis) + space(1) + 'rr' 
     End 


if exists (select account_id from tbl_noR6) 
    begin 
     select dbo.make_indicator(acent,chem,co,dim,lg,pl,str,vis) + space(2) + 'cc' 
    end 


if exists (select account_id from tbl_acct) 
    begin 
       select dbo.make_indicator(cent,chem,co,dim,lg,pl,str,vis) + space(3) + 'pp' 
    end 

if exists (select account_id from test_con) 
    begin 
       select dbo.make_indicator(cent,chem,co,dim,lg,pl,str,vis) + space(4) + 'no' 
    end 

    )as value from CRS_PRODLINE 

код работает частично с сазом и дает выход только в первом случае удовлетворяются и не проверяет остальное:

DECLARE @cols AS NVARCHAR(MAX), 
@query AS NVARCHAR(MAX); 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.A_NAME) 
     FROM TEST_DEL c 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 

SET @query = 'SELECT account_id, ' + @cols + ' from 
     (select account_id, 
       (case 
       when exists (select account_id from [dbo].[TEST_R6]) 
       then 
       dbo.make_indicator(acent,chem,co,dim,lg,pl,str,vis) + space(1) 


       when exists (select account_id from tbl_noR6) 
       then 
       dbo.make_indicator(acent,chem,co,dim,lg,pl,str,vis) + space(2) 

       when exists (select account_id from tbl_acct) 
       then 
       dbo.make_indicator(acent,chem,co,dim,lg,pl,str,vis) + space(2) 

      end) as value, 
      assay_name 
      from CRS_PRODLINE 
     ) x 
     pivot 
     (
      MAX(newvalue) 
      for a_name in (' + @cols + ') 
     ) p ' 

execute(@query) 
+0

Запрос, написанный выше, неверен. не могли бы вы предоставить свой usecase то, что именно вы хотите достичь. дайте пример –

+0

Эта помощь помогает, это уже часть динамического запроса, где я для поворота данных, полученных из этих таблиц. Мне действительно нужно просто вызвать функцию с указанными пространствами в зависимости от таблиц, в которых она присутствует. Например, если учетная запись присутствует в 1-й таблице, тогда функция должна вывести свой вывод с 1 пробелом, если во 2-й таблице с 2 пространства и так далее! Я добавляю код, который частично работает с оператором case, но, как и в случае с sql select, он выпадает, как только выполняется первое условие! –

ответ

0

Прежде всего, если в таблице есть какая-либо запись, ваше предложение exists вернет true. Я предполагаю, что это намеренно, и вы не пытаетесь сопоставить определенную учетную запись.

Если вы хотите использовать эту структуру, вам придется использовать динамический SQL. Что-то вроде этого:

DECLARE @Sql VARCHAR(8000) 
IF EXISTS (SELECT account_id FROM tbl_noR6) 
BEGIN 
    SET @Sql = 'select dbo.make_indicator(acent,chem,co,dim,lg,pl,str,vis) + space(2) + ''cc''' 
    SET @Sql = @Sql + ')as value from CRS_PRODLINE' 
    EXEC @Sql 
END 

IF EXISTS (SELECT account_id FROM tbl_acct) 
BEGIN 
    SET @Sql = 'select dbo.make_indicator(cent,chem,co,dim,lg,pl,str,vis) + space(3) + ''pp''' 
    SET @Sql = @Sql + ')as value from CRS_PRODLINE' 
    EXEC @Sql 
END 

IF EXISTS (SELECT account_id FROM test_con) 
BEGIN 
    SET @Sql = 'select dbo.make_indicator(cent,chem,co,dim,lg,pl,str,vis) + space(4) + ''no''' 
    SET @Sql = @Sql + ')as value from CRS_PRODLINE' 
    EXEC @Sql 
END 
+0

Эта помощь помогает, это уже часть динамического запроса, где я для поворота данных, полученных из этих таблиц. Мне действительно нужно просто вызвать функцию с указанными пространствами в зависимости от таблиц, в которых она присутствует. Например, если учетная запись присутствует в 1-й таблице, тогда функция должна вывести свой вывод с 1 пробелом, если во 2-й таблице с 2 пространства и так далее! Я добавляю код, который частично работает с оператором case, но, как и в случае с sql select, он выпадает, как только выполняется первое условие! –

0

Основываясь на ваш комментарий, что СЛУЧАЙ оценивает только один раз быть проблемой, это должно построить строку всех применимых случаях.

select account_id, 
(
    '' 
    + 
    case when exists (select account_id from dbo.[TEST_R6]) THEN select dbo.make_indicator(cent,chem,co,dim,lg,pl,strs,vis) + space(1) + 'rr' ELSE '' END 
    + 
    case when exists (select account_id from dbo.tbl_noR6) THEN select dbo.make_indicator(acent,chem,co,dim,lg,pl,str,vis) + space(2) + 'cc' ELSE '' END 
    + 
    case when exists (select account_id from dbo.tbl_acct) THEN select dbo.make_indicator(cent,chem,co,dim,lg,pl,str,vis) + space(3) + 'pp' ELSE '' END 
    + 
    case when exists (select account_id from dbo.test_con) THEN select dbo.make_indicator(cent,chem,co,dim,lg,pl,str,vis) + space(4) + 'no' ELSE '' END  
) as value 

from CRS_PRODLINE