2010-06-23 4 views
1

Comment puis-je passer et utiliser le nom de colonne pour récupérer une variable bigint dans la colonne réelle?Comment transmettre une colonne en tant que paramètre dans la procédure stockée?

DECLARE @personID BIGINT, 
DECLARE @queryString varchar(500) 

Set @queryString = 'Select @personID = ' + @PersonColumnID + ' from dbo.Loss_Witness where WitnessID = @witnessID' 
exec(@queryString) 

Le message d'erreur indique "Doit déclarer la variable '@personID'." J'ai également essayé

Set @queryString = 'Select ' + @personID + ' = ' + @witnessPersonID + ' from dbo.Loss_Witness where WitnessID = @witnessID' 

Et a reçu le message d'erreur "Erreur lors de la conversion du type de données varchar en bigint."

Des pensées?

Répondre

6

Vous devez spécifier que @personID est un paramètre avec le mot-clé OUTPUT:

DECLARE @SQL NVARCHAR(max) 
    SET @SQL = 'SELECT @personID = w.' + @PersonColumnID + ' 
        FROM dbo.Loss_Witness w 
       WHERE w.witnessID = @witnessID ' 

BEGIN 

    EXEC sp_executesql @SQL, @personID = @personID OUTPUT, @witnessID 

END 

Il y a another example here.

1

Notez également qu'il existe potentiellement un trou de sécurité d'injection SQL dans votre code. Si vous n'êtes pas en train de désinfecter @PersonColumnID, vous pourriez avoir de gros problèmes.

+0

@OMG Ponies Il y a toujours un risque ici, même si léger: les noms de colonne ne peuvent pas être passés comme paramètres de sp_executesql et donc la raison de la concaténation dans l'entrée (mais notez que les valeurs sont paramétrées). –

+0

J'ai du mal à comprendre ce commentaire. Le document que vous citez est excellent, et une lecture standard sur SQL dynamique. Mais indépendamment de cela, il y a un énorme point d'injection SQL dans le code donné et dans votre réécriture, sauf si @PersonColumnID est nettoyé. Il était possible que le questionneur n'était pas au courant de cela. – Yellowfog

+0

SELECT @PersonColumnID = '1; drop database blah - '; – Yellowfog

Questions connexes