TSQL'无效列名'sproc参数值的错误

时间:2010-03-18 19:36:25

标签: sql-server 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'运行此sproc时,我收到以下错误:

Invalid column name 'COB'.

有谁知道为什么?

THX!

4 个答案:

答案 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)