Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwenden von Variablen mit dynamischem SQL

Sie haben die Zeile AND ( @BG = ''''OR COM.BGName =''' + @BG +''' . `@BG' ist in Ihrem dynamischen SQL nicht deklariert. Sie müssen es wie später in derselben Zeile übergeben:

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

Diese Abfrage scheint jedoch offen für SQL-Injection zu sein; Sie sollten es viel besser parametrieren:

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

Hinweis (da ich weiß, dass Leute die Angewohnheit haben, Kommentare, die Leute für sie hinterlassen, nicht in ihrem Code zu lesen), habe ich keine Ahnung, was der Datentyp für @BG ist und @Trans_date ist, also habe ich geahnt sie sind int und date beziehungsweise. Sie müssen dies ändern, wenn ich falsch geraten habe.

Sie können aus den Kommentaren ersehen, dass Sie sich auch ansehen müssen, wie Sie die Werte der Spalten zu Ihrer Abfrage hinzufügen. so wie du es gemacht hast kann Seien Sie auch offen für Injektionen, aber ich habe den früheren Teil Ihrer Anfrage nicht gesehen.