2014-01-29 40 views
1

我正在執行以下sql。我得到的語法錯誤是('='附近的語法不正確) 查詢執行正常並在正常執行時給出正確的結果。無法理解。看看。動態sql語法錯誤。

DECLARE @pvchMachineId VARCHAR(100) = '' 

DECLARE @pvchMake VARCHAR(100) = '' 

DECLARE @sql NVARCHAR(1000) 

SELECT @sql = ' SELECT TOP 20 x.intId, x.vchMachineId, x.AUDenom, x.intGroupId, 

x.vchMake, x.vchModel, x.mCurrency 

from dbo.Machine x 

inner join 
(select max(m1.AUDenom) as audenom, m1.vchMachineId 

from dbo.Machine m1 
left JOIN dbo.ImportedFile ife on m1.intImportedFileId = ife.intId 
WHERE ife.dtFileDate >= ''1-1-2013'' AND ife.dtFileDate <= ''1-29-2014'' AND 

--following two lines cause the error 

(' + @pvchMake + '= ''0'' OR m1.vchMake = @pvchMake) AND 

(' + @pvchMachineId +'= ''0'' OR m1.vchMachineId = @pvchMachineId) 

group by vchMachineId) y 

on x.AUDenom = y.audenom and x.vchMachineId = y.vchMachineId 
ORDER BY x.AUDenom DESC' 
+0

變量的值是什麼? – user2989408

+0

你如何傳遞這些參數來執行語句? – 2014-01-29 20:12:49

+1

你可以顯示你的查詢的非動態版本嗎?這有助於理解你的意思。 –

回答

2

更新查詢以下

(@pvchMake = ''0'' OR m1.vchMake = @pvchMake) AND 
(@pvchMachineId = ''0'' OR m1.vchMachineId = @pvchMachineId) 

比你稍後去執行只是將它作爲參數傳遞給sp_executesql函數。

EXEC sp_executesql @sql 
     ,N'@pvchMachineId VARCHAR(100), @pvchMake VARCHAR(100)' 
     ,@pvchMachineId,@pvchMake 

或這是清潔

Declare @ParametersDefinition NVARCHAR(max) = N'@pvchMachineId VARCHAR(100), @pvchMake VARCHAR(100)' 
EXEC sp_executesql @sql, @ParametersDefinition, @pvchMachineId,@pvchMake 

在你不想來連接你的動態SQL語句的結束,它會打開它的SQL注入。儘管這是一個有效的選擇,但應該不惜一切代價避免。

+0

我也從應用程序執行它。它工作正常 – THunter

2

本聲明:

'(' + @pvchMake + '= ''0'' OR m1.vchMake = @pvchMake)' 

會輸出,因爲變量不被別的初始化比''

(= '0' OR m1.vchMake = @pvchMake) 

哪項不正確syntaxically。

你應該使用:

'(''' + @pvchMake + '''= ''0'' OR m1.vchMake = @pvchMake)' 

這將輸出:

(''= '0' OR m1.vchMake = @pvchMake) 
+0

如果我想讓OR運算器短路,我會發送一個0或''來自應用程序。如果需要匹配,我發送一個字符串值。 – THunter

+0

實際上並非如此。看我的編輯。 – cubitouch

0

也許這是有意義的:

... 

(''' + @pvchMake + '''= ''0'' OR m1.vchMake = ''' + @pvchMake +''') AND 

(''' + @pvchMachineId +'''= ''0'' OR m1.vchMachineId = ''' + @pvchMachineId + ''') 
... 
+0

謝謝老闆。這工作得很好。 – THunter

+0

[email protected]或者您可以發送''''''而不是''''。 – user2989408

+1

@THunter,如果你想傳遞'@ pvchMake'和'@ pvchMake'作爲參數,你可以使用@SaUce解決方案。 –