[英]How to use the AND in a variable in the WHERE clause
我試圖在變量中使用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之前使用&運算符,則會出現錯誤。 任何幫助將不勝感激
在添加“ AND”之前,如果您檢查@v_Criteria是否不是空字符串,則不會出現任何錯誤。
因此,將AND與例如“ AND InvoiceValue IS NOT NULL”分開,然后根據@v_Criteria的值添加或不添加AND
那這個解決方案呢?
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
您不能在查詢后附加“字符串”,它會成為代碼的一部分。 它仍然只是一個字符串。 本質上,您正在嘗試執行動態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
它很復雜而且很深入,您將學到很多有價值的課程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.