Ошибка TSQL «Неверное имя столбца» при значении параметра sproc - PullRequest
3 голосов
/ 18 марта 2010

вот мой код:

DECLARE @SQL varchar(600)

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

EXEC (@SQL)

При запуске этого sproc с unitCode = 'COB' и currYEAR = '10' я получаю следующую ошибку:

Invalid column name 'COB'.

Кто-нибудь знает почему?

ТНХ!

Ответы [ 4 ]

8 голосов
/ 18 марта 2010

Это хорошая уязвимость в 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
5 голосов
/ 18 марта 2010

Вам нужно поместить кавычки вокруг значений в SQL:

'SELECT     CategoryID, SubCategoryID, ReportedNumber
FROM    tblStatistics
WHERE   UnitCode = ''' + @unitCode +
''' AND   FiscYear = ''' + @currYEAR + ''''
3 голосов
/ 18 марта 2010

Если мы можем предположить, что UnitCode является полем VARCHAR, вам нужно добавить кавычки вокруг переменной @unitcode.

DECLARE @SQL varchar(600) 

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

EXEC (@SQL) 
3 голосов
/ 18 марта 2010

В ваших кавычках нет кавычек - SQL по сути видит

WHERE UnitCode = COB

и COB не должны быть столбцом. Но почему вы строите SQL таким образом? Почему не

SELECT CategoryID, SubCategoryID, ReportedNumber
  FROM tblStatistics
 WHERE UnitCode = @unitCode
   AND FiscYear = @currYear
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...