sql >> Databáze >  >> RDS >> Sqlserver

Použití proměnné s dynamickým SQL

Máte řádek AND ( @BG = ''''OR COM.BGName =''' + @BG +''' . `@BG' není ve vašem dynamickém SQL deklarováno. Musíte to předat jako později ve stejném řádku:

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

Tento dotaz se však zdá být otevřený pro SQL injection; bylo by mnohem lepší to parametrizovat:

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

Poznámka (protože vím, že lidé mají ve zvyku nečíst komentáře, které jim lidé zanechávají v kódu), nemám ponětí, jaký je datový typ pro @BG a @Trans_date je, takže jsem usoudil, že jsou int a date respektive. Pokud jsem to odhadl špatně, budete to muset změnit.

Z komentářů můžete vidět, že se musíte podívat na to, jak do dotazu přidáváte hodnoty sloupců; jak jste to udělali možná být také otevřený injekci, ale neviděl jsem předchozí část vašeho dotazu.




  1. Použití BINARY_CHECKSUM(*) s více tabulkami

  2. SQL MEZI – chytré tipy pro vyhledávání řady hodnot

  3. Smazat záznamy v rámci spouštěče namísto smazání

  4. Přehled SQL suma za rok, hledá elegantní řešení