Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Utilisation de Variable avec Dynamic SQl

Vous avez la ligne AND ( @BG = ''''OR COM.BGName =''' + @BG +''' . `@BG' n'est pas déclaré dans votre Dynamic SQL. Vous devez le passer comme vous l'avez fait plus tard dans la même ligne :

AND   ( '' +  @BG + '' = '''' OR  COM.BGName =''' + @BG +'''

Cette requête, cependant, semble être ouverte à l'injection SQL ; mieux vaut le paramétrer :

SET @query = N'
SELECT ComponentName,
        '+ @cols + N'  --This might need to be changed as well, but i don''t know how you''re generating this and I''m not guessing
FROM (SELECT SUM(('+ @Sum_cols + N') AS Comp_stock, --This might need to be changed as well, but i don''t know how you''re generating this and I''m not guessing
             Com.ComponentName,
             BB.BB_Name  
      FROM Z_DM_DR_CM_STOCK COM
           INNER JOIN BLOOD_BANK_MASTER BB ON COM.BB_srno =BB.BB_SRNO
      WHERE Com.Trans_date = @sTrans_date
        AND (@sBG = '''' OR COM.BGName = @sBG )
      GROUP BY Com.ComponentName,
               BB.BB_Name) AS sourcetable 
PIVOT (
    --This might need to be changed as well, but i don''t know how you''re generating this and I''m not guessing
    SUM([Comp_stock]) FOR [BB_Name] IN ('+ @cols + N')) AS PIVOTTABLE
ORDER BY ComponentName';

EXEC sp_executesql @query, N'@sBG int, @sTrans_date date', @sBG = @BG, @sTrans_Date = @trans_date; --I have guessed your data types

Remarque (comme je sais que les gens ont l'habitude de ne pas lire les commentaires que les gens leur laissent dans leur code), je n'ai aucune idée du type de données pour @BG et @Trans_date est, donc j'ai deviné qu'ils sont int et date respectivement. Vous devrez changer cela, si j'ai mal deviné.

Vous pouvez voir dans les commentaires que vous devez également examiner la façon dont vous ajoutez les valeurs des colonnes à votre requête ; la façon dont vous l'avez fait peut également être ouvert à l'injection, mais je n'ai pas vu la première partie de votre requête.