2010-03-18 61 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

相关问题