2010-06-23 7 views
1

Je rencontre des problèmes pour créer une requête SQL dynamique assez simple. Les variables n'affichent pas les valeurs qu'elles contiennent lorsque j'imprime @SQLString. Des idées?Ecriture de requêtes SQL dynamiques

ALTER PROCEDURE [dbo].[usp_ItemSearch] 
    @ItemNum varchar(30) = NULL 
    ,@SearchFilter int 
    ,@VendorNum varchar(10) = NULL 
    ,@RecUserID int = NULL 
    ,@StartDate smalldatetime = NULL 
    ,@EndDate smalldatetime = NULL 
AS 
DECLARE @SQLString as varchar(1000) 

SET @SQLString = 'SELECT RecID, VendorNum, VendorName, PORelNum, InvoiceNum, ItemNum, RecAddDate, LastUpdated FROM tbl_Processor_ItemDscLog' 

IF @ItemNum IS NOT NULL 
    BEGIN 
     IF @SearchFilter = 2 
      BEGIN 
       SET @SQLString = @SQLString + ' WHERE ItemNum LIKE ''%' + @ItemNum + '''' --Ends with 
      END 
     IF @SearchFilter = 1 
      BEGIN 
       SET @SQLString = @SQLString + ' WHERE ItemNum LIKE ''%' + @ItemNum + '%''' --Contains 
      END 
     IF @SearchFilter = 0 
      BEGIN 
       SET @SQLString = @SQLString + ' WHERE ItemNum LIKE ''' + @ItemNum + '%''' --Starts with 
      END 
    END 

IF @VendorNum IS NOT NULL 
    BEGIN 
     SET @SQLString = @SQLString + ' WHERE VendorNum = ''' + @VendorNum + '''' 
    END 

IF @RecSearchUserID IS NOT NULL 
    BEGIN 
     SET @SQLString = @SQLString + ' AND (RecAddUserID = @RecUserID)' 
    END 

IF (@EndDate IS NOT NULL) 
    BEGIN 
     IF (@StartDate IS NOT NULL) 
      BEGIN 
       SET @SQLString = @SQLString + ' WHERE RecAddDate between @StartDate AND @EndDate ' 
      END 
     ELSE 
      BEGIN 
       SET @SQLString = @SQLString + ' RecAddDate BETWEEN 01/01/1996 AND @EndDate + ' 
      END 
    END 

SET @SQLString = @SQLString + ' ORDER BY ItemNum, VendorNum' 
PRINT @SQLString 
+0

Votre 'PRINT @ SQLString' est-il dans la procédure stockée? (Je ne peux pas le voir) –

+0

Oui c'est. Je viens d'éditer le code. Merci pour ça. – Frank

+0

Il y a de bonnes raisons pour éviter de faire du SQL dynamique dans T-SQL. Par exemple, que se passe-t-il si '@ ItemNum' est' O'Malley'? En général, ne faites pas de SQL dynamique de cette façon. Faites-le dans un composant de niveau intermédiaire en tant que requête paramétrée. – Thomas

Répondre

3

Vous ajoutez @ItemNum et @VendorNum à @SQLString correctement, mais vous n'êtes pas ajouter les autres 3 variables correctement. Vous devez les convertir en varchar et les concaténer sur @SQLString de la même manière que les autres.

Par exemple, voici comment le bloc @RecSearchUserID devrait ressembler à:

IF @RecSearchUserID IS NOT NULL 
    BEGIN 
     SET @SQLString = @SQLString + ' AND (RecAddUserID = ' + CAST(@RecUserID AS VarChar) + ')' 
    END 

En outre, vous ne devez faire attention à vos variables d'entrée contenant des apostrophes comme les autres commentateurs l'ont souligné afin de protéger contre SQL injection ...