2013-11-26 49 views
1

我正在嘗試使用具有許多可能where子句的存儲過程。我的存儲過程現在返回「錯誤的關鍵字附近的語法」作爲錯誤。存儲過程中的Where子句中的變量

Select @SQL = 'SELECT Table1.Col1, Table2.Col2 
FROM Table1 
INNER JOIN Table2 on Table1.Col1 = Table2.Col1 
WHERE ' + @where 

Exec(@SQL) 

@Where會像

'Table1.Col1 = 'Apples' OR Table1.Col1 = 'BANNANAS' OR Table2.Col2 = 'CHOCOLATE'' 

編輯: 它與我能得到它沒有一個錯誤運行的所有建議亂搞之後。現在它不會返回任何結果。

+0

那麼是什麼問題? –

+0

嘗試轉義值的單引號。 – user2989408

+1

什麼是語法錯誤?運行'SELECT @ SQL'來查找你的查詢是什麼,然後運行這個獨立的,會發生什麼? – Tom

回答

4

你的問題可能是你需要雙引號的所有文字?

'Table1.Col1 = ''Apples'' OR Table1.Col1 = ''BANNANAS'' OR Table2.Col2 = ''CHOCOLATE''' 
+0

嘗試過,仍然得到「不正確的語法靠近關鍵字'從'。」 – user2920788

+0

請執行「select @SQL」並將結果發佈到您的問題(編輯您的問題)。 –

+0

似乎在這裏工作http://sqlfiddle.com/#!3/3093f/3 - 注意,這不會返回任何東西,因爲我沒有巧克力,香蕉或蘋果作爲價值觀,但它的工作原理。再次檢查你的語法。 'SELECT TOP 1 * FROM Table1'返回嗎?也許你沒有使用正確的模式 – Tom

0

使用char(39)作爲引號。

'Table1.Col1 = '+char(39)+Apples+char(39)+' OR Table1.Col1 = '+ Char(39)+BANNANAS+char(39)+' OR Table2.Col2 = '+char(39)+CHOCOLATE+char(39)' 
-1

只是猜測,但應該爲變量「@Where」使用不同的名稱。

btw)從字符串中進行這種類型的建築查詢不是一個好習慣。性能,安全性和所有這些問題。

安德烈

+0

這可能會更好地作爲OP的評論,而不是一個獨立的答案,恕我直言。我沒有讓你失望,我試圖解釋爲什麼有些人會這樣做。 – granadaCoder

0

下面是一個替代的解決方案。

它不是「動態SQL」,但它是靈活的,「乾淨」的恕我直言。

Use Northwind 
GO 

declare @holder table (ProductName nvarchar(40)) 


Insert into @holder (ProductName) 
select 
'Chai' union all select 'Chang' union all select 'Aniseed Syrup' 

SELECT 
     [ProductID] 
     ,[ProductName] 
     ,[SupplierID] 
     ,[CategoryID] 
     ,[QuantityPerUnit] 
     ,[UnitPrice] 
     ,[UnitsInStock] 
     ,[UnitsOnOrder] 
     ,[ReorderLevel] 
     ,[Discontinued] 
FROM 
    [dbo].[Products] prod 
    where 
     exists (select null from @holder innerH where innerH.ProductName = prod.ProductName) 


declare @holderCOUNT int 
select @holderCOUNT = count(*) from @holder 


SELECT 
     [ProductID] 
     ,[ProductName] 
     ,[SupplierID] 
     ,[CategoryID] 
     ,[QuantityPerUnit] 
     ,[UnitPrice] 
     ,[UnitsInStock] 
     ,[UnitsOnOrder] 
     ,[ReorderLevel] 
     ,[Discontinued] 
FROM 
    [dbo].[Products] prod 
    where 
    (@holderCOUNT = 0 OR (exists (select null from @holder innerH where innerH.ProductName = prod.ProductName) )) 

delete from @holder 
select @holderCOUNT = count(*) from @holder 

SELECT 
     [ProductID] 
     ,[ProductName] 
     ,[SupplierID] 
     ,[CategoryID] 
     ,[QuantityPerUnit] 
     ,[UnitPrice] 
     ,[UnitsInStock] 
     ,[UnitsOnOrder] 
     ,[ReorderLevel] 
     ,[Discontinued] 
FROM 
    [dbo].[Products] prod 
    where 
    (@holderCOUNT = 0 OR (exists (select null from @holder innerH where innerH.ProductName = `enter code here`prod.ProductName) ))