sql >> Base de Datos >  >> RDS >> Sqlserver

Uso de variables con SQl dinámico

Tienes la línea AND ( @BG = ''''OR COM.BGName =''' + @BG +''' . `@BG' no está declarado en su Dynamic SQL. Debe pasarlo como lo hizo más tarde en la misma línea:

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

Esta consulta, sin embargo, parece estar abierta a la inyección SQL; sería mucho mejor parametrizarlo:

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

Nota (como sé que las personas tienen la costumbre de no leer los comentarios que las personas les dejan en su código) no tengo idea de cuál es el tipo de datos para @BG y @Trans_date es, por lo tanto, he adivinado que son int y date respectivamente. Tendrás que cambiar esto, si he adivinado incorrectamente.

Puede ver en los comentarios que también necesita ver cómo agrega los valores de las columnas a su consulta; la forma en que lo has hecho puede también esté abierto a la inyección, pero no he visto la parte anterior de su consulta.