如何在WHERE子句中的变量中使用AND

时间:2018-05-23 07:58:34

标签: sql sql-server tsql sql-server-2012

我试图在变量中使用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之前使用了+运算符,然后我没有得到任何结果。如果我使用&在@v_Criteria之前的opertor,我收到一个错误。任何帮助将不胜感激

3 个答案:

答案 0 :(得分:0)

在添加"之前AND"如果你检查@v_Criteria是不是空字符串,那么你不会收到任何错误。

从例如"分裂AND AND InvoiceValue不是NULL" 然后根据@v_Criteria

的值添加AND或不

答案 1 :(得分:0)

这个解决方案怎么样?

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

答案 2 :(得分:0)

您无法附加"字符串"查询,它成为代码的一部分。它仍然只是一个字符串。基本上你是在尝试做动态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

它很复杂,而且深入,你将学到很多宝贵的经验教训。