Как использовать AND в переменной в предложении WHERE - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь использовать оператор AND в переменной и использовать его в предложении WHERE.Я пытаюсь сделать это без использования динамического SQL.то есть, не назначая весь запрос переменной.

DECLARE @v_Criteria varchar(500)
DECLARE @jobtype varchar(500) = 'test Job'

    IF @inparam ='Report1'
        BEGIN
            SET @v_Criteria= ''
        END
    ELSE IF @inparam='Report2'
        BEGIN
            SET @v_Criteria= ' AND InvoiceValue IS NOT NULL'
        END


    SELECT *
    FROM tblJobs
    WHERE  JobID NOT IN (63,87,469)    
      AND JobType LIKE '%' + @jobtype + '%' 
      + @v_Criteria

Я использовал оператор + перед @v_Criteria, а затем я не получил результатов.Если я использую & opertor до @v_Criteria, я получаю сообщение об ошибке.Любая помощь будет принята с благодарностью

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

А как насчет этого решения?

DECLARE @v_Criteria varchar(500)
DECLARE @jobtype varchar(500) = 'test Job'

    IF @inparam ='Report1'
        BEGIN
            SET @v_Criteria= ''
        END
    ELSE IF @inparam='Report2'
        BEGIN
            SET @v_Criteria= ' AND InvoiceValue IS NOT NULL'
        END


    SELECT *
    FROM tblJobs
    WHERE  JobID NOT IN (63,87,469)    
      AND JobType LIKE '%' + @jobtype + '%' 
      AND ISNULL(InvoiceValue, '') NOT LIKE CASE
                                                 WHEN @inparam = 'Report2'
                                                 THEN ''
                                                 ELSE 'SOMEIMPOSSIBLEVALUE'
                                                 END
0 голосов
/ 23 мая 2018

Вы не можете добавить «строку» к запросу, и она станет частью кода.Это все еще просто строка.По сути, вы пытаетесь сделать динамический SQL, но потом говорите, что вам не нужен динамический SQL?

Один из вариантов - построить логику для обоих случаев в SQL ...

SELECT *
FROM tblJobs
WHERE JobID NOT IN (63,87,469)    
  AND JobType LIKE '%' + @jobtype + '%'
  AND (
    (@inparam ='Report1')
    OR 
    (@inparam ='Report2' AND InvoiceValue IS NOT NULL)
  )

Это означает, что планировщик запросов должен постоянно справляться с обоими случаями.Один план решить оба случая.Это экономит ваш набор текста, но может означать, что вы получаете плохой план выполнения и тратите ресурсы или время выполнения.

Чтобы обойти это, вам нужно два запроса ...

IF (@inparam = 'Report1')
BEGIN
  SELECT *
  FROM tblJobs
  WHERE JobID NOT IN (63,87,469)    
    AND JobType LIKE '%' + @jobtype + '%'
END
ELSE IF (@inparam = 'Report2')
BEGIN
  SELECT *
  FROM tblJobs
  WHERE JobID NOT IN (63,87,469)    
    AND JobType LIKE '%' + @jobtype + '%'
    AND InvoiceValue IS NOT NULL
END

Или простоиспользовать динамический SQL ...

SET @sql= 'SELECT *
             FROM tblJobs
            WHERE JobID NOT IN (63,87,469)    
              AND JobType LIKE ''%''' + @jobtype + '%''' + @v_Criteria

EXEC sp_executesql @sql

или ...

SET @sql= 'SELECT *
             FROM tblJobs
            WHERE JobID NOT IN (63,87,469)    
              AND JobType LIKE ''%'' + @jobtype_param + ''%''' + @v_Criteria

EXEC sp_executesql
         @sql,
         N'@jobtype_param varchar(500)',
         @jobtype_param = @jobtype

(Преимущество в том, что вы не будете создавать новый план кэшированных запросов для каждого @jopbtype. Вместо этого он создает параметризованный план запроса и использует его повторно.)

РЕДАКТИРОВАТЬ:

По сути, вы исследуете динамический поиск.

Если это когда-либо становится сложнее, чем этоНапример, я настоятельно рекомендую прочитать эту статью: http://www.sommarskog.se/dyn-search.html

Это сложно и подробно, и вы выучите много ценных уроков.

0 голосов
/ 23 мая 2018

Перед добавлением «И», если вы проверяете, является ли @v_Criteria не пустой строкой, вы не получите никакой ошибки.

Разделите И, например, на «AND InvoiceValue IS NULL» Затем добавьте И или нетв соответствии со значением @ v_Criteria

...