2010-03-18 4 views
3

voici mon code:TSQL 'nom de colonne non valide' erreur sur la valeur du paramètre sproc

DECLARE @SQL varchar(600) 

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

EXEC (@SQL) 

Quand je lance ce sproc avec unitcode = 'COB' et currYEAR = '10', je reçois l'erreur suivante:

Invalid column name 'COB'. 

Est-ce que quelqu'un sait pourquoi?

thx!

+0

Une bonne façon de tester votre SQL dynamique est-à-dire 'PRINT @ sql' au lieu de' EXEC (@SQL) '... cette façon, vous pouvez jeter un oeil à l'instruction SQL que vous attendez pour courir :) –

Répondre

5

Vous devez mettre des guillemets autour des valeurs dans le SQL:

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

merci! cela fait sens maintenant – Daria

8

C'est une belle vulnérabilité d'injection SQL là.

Commencez par la réécriture de cette façon, en utilisant paramètres de liaison:

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

je fais des tests d'injection sql ailleurs, mais merci! – Daria

+3

@Daria: Quoi? Vous ne faites pas de "tests" d'injection SQL, vous concevez vos scripts et code pour l'empêcher en premier lieu. Le code que vous avez publié est une vulnérabilité d'injection SQL - période. C'est la seule * bonne * façon d'écrire du SQL dynamique avec des paramètres, et cela résoudra votre erreur ici en même temps. – Aaronaught

3

Vous n'avez pas des citations à l'intérieur de vos citations - SQL voit essentiellement

WHERE UnitCode = COB 

et COB ne doit pas être une colonne. Mais pourquoi construisez-vous le SQL de cette façon? Pourquoi ne pas

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

Correct vous n'avez pas besoin d'écrire SQL dynamique juste pour transmettre des paramètres à votre instruction select à l'intérieur d'une procédure stockée. –

+0

ce n'est pas mon code complet, juste un exemple pour contourner mon problème d'erreur. J'ai une bonne raison de le rendre dynamique. Merci! – Daria

3

Si nous pouvons supposer que UnitCode est un domaine VARCHAR vous auriez à ajouter des guillemets autour de la variable @unitcode.

DECLARE @SQL varchar(600) 

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

EXEC (@SQL) 
+0

Vous ajoutez des guillemets, pas des parenthèses ... J'ai entendu un million d'autres personnes utiliser le mauvais mot auparavant: P –

+0

@Timothy Khouri - lol. Merci pour la correction. –

Questions connexes