2010-03-18 63 views
3

這裏是我的代碼:TSQL「無效的列名稱上的存儲過程的參數值誤差

DECLARE @SQL varchar(600) 

SET @SQL = 
'SELECT  CategoryID, SubCategoryID, ReportedNumber 
FROM tblStatistics 
WHERE UnitCode = ' + @unitCode + 
' AND FiscYear = ' + @currYEAR 

EXEC (@SQL) 

當我unitCode =「COB」運行此存儲過程和currYEAR =「10」,我得到以下錯誤:

Invalid column name 'COB'. 

有誰知道爲什麼?

thx!

+0

測試動態SQL的一個好方法是使用'PRINT @ SQL'而不是'EXEC(@SQL)'......這樣你可以看看你期望的SQL語句來運行:) – 2010-03-18 19:57:26

回答

5

你需要把周圍的值引號的SQL:

'SELECT  CategoryID, SubCategoryID, ReportedNumber 
FROM tblStatistics 
WHERE UnitCode = ''' + @unitCode + 
''' AND FiscYear = ''' + @currYEAR + '''' 
+0

謝謝!現在有意義 – Daria 2010-03-18 20:08:30

8

這是有一個很好的SQL注入漏洞。

開始通過改寫這種方式,使用綁定參數:

DECLARE @SQL nvarchar(4000) 

SET @SQL = 
    'SELECT CategoryID, SubCategoryID, ReportedNumber ' + 
    'FROM tblStatistics ' + 
    'WHERE UnitCode = @UnitCode ' + 
    'AND FiscYear = @CurrYear' 

EXEC sp_executesql 
    @SQL, 
    '@UnitCode varchar(10), @CurrYear int', 
    @UnitCode = 'COB', 
    @FiscYear = 10 
+0

我是doind sql注入測試其他地方,但謝謝你! – Daria 2010-03-18 20:10:09

+3

@Daria:什麼?您不會執行SQL注入「測試」,您可以設計腳本和代碼以防止它出現。您發佈的代碼是SQL注入漏洞 - 期限。這是使用參數編寫動態SQL的唯一*正確方法,它將同時解決您的錯誤。 – Aaronaught 2010-03-18 20:48:07

3

你沒有你的報價,引號裏 - SQL基本上只能看着

WHERE UnitCode = COB 

和COB不能是一列。但爲什麼你要這樣構建SQL?爲什麼不

SELECT CategoryID, SubCategoryID, ReportedNumber 
    FROM tblStatistics 
WHERE UnitCode = @unitCode 
    AND FiscYear = @currYear 
+2

更正您不需要編寫動態SQL,只需將參數傳遞給存儲過程中的select語句即可。 – 2010-03-18 19:45:01

+0

這不是我的完整代碼,只是一個解決我的錯誤問題的例子。我確實有充分的理由讓它變得動態。謝謝! – Daria 2010-03-18 20:11:25

3

如果我們可以假設UnitCode是VARCHAR場你必須添加周圍的@unitcode變量的報價。

DECLARE @SQL varchar(600) 

SET @SQL = 
'SELECT  CategoryID, SubCategoryID, ReportedNumber 
FROM tblStatistics 
WHERE UnitCode = ''' + @unitCode + '''' 
' AND FiscYear = ' + @currYEAR 

EXEC (@SQL) 
+0

您正在添加引號而不是括號......我聽說有一百萬其他人在那裏使用了錯誤的單詞:P – 2010-03-18 19:58:17

+0

@Timothy Khouri - 哈哈。謝謝你的糾正。 – 2010-03-19 07:36:26

相關問題