2010-03-18 2 views
3

вот мой код:Tsql «Неверное имя столбца» ошибка по значению параметра sproc

DECLARE @SQL varchar(600) 

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

EXEC (@SQL) 

Когда я запускаю этот sproc с unitCode = «СОВ» и currYEAR = «10», я получаю следующее сообщение об ошибке:

Invalid column name 'COB'. 

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

thx!

+0

Хороший способ проверить динамический SQL, чтобы сказать 'PRINT @ SQL' вместо' EXEC (@sql) '... что, как вы посмотрите на заявление SQL, что вы ожидаете может для запуска :) –

ответ

5

Вы должны поставить кавычки значений в SQL:

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

спасибо! что имеет смысл сейчас – Daria

8

Это хороший SQL инъекции уязвимости там.

Start, переписав его таким образом, используя параметры связывания:

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

Я занят sql инъекционными испытаниями в другом месте, но спасибо! – Daria

+3

@ Дария: Что? Вы не выполняете «тесты» SQL-инъекций, вы разрабатываете свои сценарии и код, чтобы предотвратить его в первую очередь. Код, который вы опубликовали, - это уязвимость SQL-запросов. Это * только * правильный способ записи динамического SQL с параметрами, и он будет решать вашу ошибку здесь в одно и то же время. – Aaronaught

3

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

WHERE UnitCode = COB 

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

SELECT CategoryID, SubCategoryID, ReportedNumber 
    FROM tblStatistics 
WHERE UnitCode = @unitCode 
    AND FiscYear = @currYear 
+2

Исправьте, вам не нужно писать динамический sql, чтобы передать параметры в ваш оператор select внутри хранимой процедуры. –

+0

Это не мой полный код, просто пример, чтобы охватить мою проблему с ошибкой. У меня есть веская причина сделать его динамичным. благодаря! – Daria

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 –

+0

@Timothy Khouri - lol. Спасибо за исправление. –

Смежные вопросы