2010-06-29 6 views
2

J'écris une requête SQL assez simple dans SQL 2005, mais je rencontre un problème et je n'arrive pas à comprendre ce qui ne va pas.Ecriture d'un simple SQL Server 2005 SQL dynamique

Pour la documentation, la requête doit être une sql dynamique

Un extrait de ma requête est:

@RecCreatorID int 
.... 
.... 
IF (@RRecCreatorID IS NOT NULL) 
    Begin 
     Set @strSQL = @strSQL + ' AND RecCreatorID = @RecCreatorID' 
    End 

Cependant, quand je lance IMPRIMER @strSQL, ce que je reçois est

Et RecCreatorID = @RecCreatorID

Comment puis-je obtenir la valeur réelle de @RecCreatorID à afficher?

Répondre

3
@RecCreatorID int 
.... 
.... 
IF (@RRecCreatorID IS NOT NULL) 
    Begin 
     Set @strSQL = @strSQL + ' AND RecCreatorID =' + cast(@RecCreatorID as varchar(50)) 
    End 

Une autre solution consiste à utiliser sp_executesql pour exécuter la requête

+0

Pourquoi devrais-je le lancer comme varchar si c'est un int dans le proc? – user279521

+0

car @RecCreatorID est un nombre entier et @strSQL est varchar –

+0

Correct, mais peut entraîner des injections SQL. (Bien sûr, lorsque @RecCreatorId est une chaîne.) – treaschf

2

Utilisez sp_executesql. Cette procédure stockée acceptera des paramètres que vous pourrez ensuite utiliser dans votre SQL dynamique (substitution de paramètres). Par exemple:

Set @strSQL = @strSQL + ' AND RecCreatorID = @RecCreatorID_PARAM' 


exec sp_executesql @SQL, 
N'@RecCreatorID_PARAM int', 
@RecCreatorID_PARAM = @RecCreatorID 

Bien que cela ne fait pas beaucoup pour l'affichage des fins, il est encore une meilleure façon de gérer SQL dynamique que concaténation, IMHO.