我试图在变量中使用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,我收到一个错误。任何帮助将不胜感激
答案 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
它很复杂,而且深入,你将学到很多宝贵的经验教训。