这是我的代码:
DECLARE @SQL varchar(600)
SET @SQL =
'SELECT CategoryID, SubCategoryID, ReportedNumber
FROM tblStatistics
WHERE UnitCode = ' + @unitCode +
' AND FiscYear = ' + @currYEAR
EXEC (@SQL)
当我使用unitCode ='COB'和currYEAR ='10'运行此sproc时,我收到以下错误:
Invalid column name 'COB'.
有谁知道为什么?
THX!
答案 0 :(得分: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
答案 1 :(得分:5)
您需要在SQL中添加引号:
'SELECT CategoryID, SubCategoryID, ReportedNumber
FROM tblStatistics
WHERE UnitCode = ''' + @unitCode +
''' AND FiscYear = ''' + @currYEAR + ''''
答案 2 :(得分:3)
你的引号里面没有引号 - SQL本质上看
WHERE UnitCode = COB
和COB不能是一列。但是你为什么用这种方式构建SQL呢?为什么不
SELECT CategoryID, SubCategoryID, ReportedNumber
FROM tblStatistics
WHERE UnitCode = @unitCode
AND FiscYear = @currYear
答案 3 :(得分:3)
如果我们可以假设UnitCode是VARCHAR
字段,则必须在@unitcode变量周围添加引号。
DECLARE @SQL varchar(600)
SET @SQL =
'SELECT CategoryID, SubCategoryID, ReportedNumber
FROM tblStatistics
WHERE UnitCode = ''' + @unitCode + ''''
' AND FiscYear = ' + @currYEAR
EXEC (@SQL)