sql >> Database >  >> RDS >> Sqlserver

Variabele gebruiken met Dynamic SQl

Je hebt de regel AND ( @BG = ''''OR COM.BGName =''' + @BG +''' . `@BG' is niet gedeclareerd in uw dynamische SQL. Je moet het doorgeven zoals je later in dezelfde regel deed:

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

Deze query lijkt echter open te staan ​​voor SQL-injectie; je zou het veel beter kunnen parametriseren:

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

Opmerking (aangezien ik weet dat mensen de gewoonte hebben om opmerkingen die mensen voor hen in hun code achterlaten niet te lezen) Ik heb geen idee wat het gegevenstype is voor @BG en @Trans_date is, dus ik heb geussed ze zijn int en date respectievelijk. Je moet dit veranderen als ik het verkeerd heb geraden.

U kunt aan de opmerkingen zien dat u ook moet kijken hoe u de waarden van de kolommen aan uw zoekopdracht toevoegt; de manier waarop je het hebt gedaan misschien sta ook open voor injectie, maar ik heb het eerdere deel van uw vraag niet gezien.




  1. Converteer een maandnaam naar het maandnummer in SQL Server (T-SQL)

  2. Get aantal weekdagen (zondag, maandag, dinsdag) tussen twee datums SQL

  3. Start Mysql automatisch opnieuw wanneer ubuntu op EC2 micro-instantie het doodt wanneer het geheugen bijna vol is

  4. PHP Bereken Aantal downline in binaire boom