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

Dar*_*ria 3 t-sql sql-server

这是我的代码:

DECLARE @SQL varchar(600)

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

EXEC (@SQL)
Run Code Online (Sandbox Code Playgroud)

当我使用unitCode ='COB'和currYEAR ='10'运行此sproc时,我收到以下错误:

Invalid column name 'COB'.
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么?

谢谢!

Aar*_*ght 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
Run Code Online (Sandbox Code Playgroud)

  • @Daria:什么?你不做SQL注入"测试",你设计你的脚本和代码,以防止它首先出现.您发布的代码是SQL注入漏洞 - 期间.这是使用参数编写动态SQL的唯一*正确方法,它将同时解决您的错误. (3认同)

Mar*_*ers 5

您需要在SQL中的值周围加上引号:

'SELECT     CategoryID, SubCategoryID, ReportedNumber
FROM    tblStatistics
WHERE   UnitCode = ''' + @unitCode +
''' AND   FiscYear = ''' + @currYEAR + ''''
Run Code Online (Sandbox Code Playgroud)