Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Използване на променлива с динамичен SQl

Имате реда AND ( @BG = ''''OR COM.BGName =''' + @BG +''' . `@BG' не е деклариран във вашия Dynamic SQL. Трябва да го предадете, както направихте по-късно в същия ред:

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

Тази заявка обаче изглежда отворена за SQL инжектиране; ще бъде много по-добре да го параметризирате:

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

Забележка (тъй като знам, че хората имат навика да не четат коментарите, които хората оставят за тях в кода си) Нямам представа какъв е типът данни за @BG и @Trans_date е, затова прецених, че са int и date съответно. Ще трябва да промените това, ако съм предположил неправилно.

Можете да видите от коментарите, че трябва да разгледате и как добавяте стойностите на колоните към вашата заявка; начина, по който сте го направили може също е отворен за инжектиране, но не съм видял по-ранната част от вашето запитване.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Предаване на стойност, разделена със запетая, от .NET към съхранена процедура, като се използва стойността във функцията IN SQL

  2. Променете картата на схемата на база данни на Entity Framework, след като първо използвате код

  3. Как да предадете низов масив в SQL параметър към IN клауза в SQL

  4. 4 начина да помогнете за предотвратяване на претоварване на сигнали с наблюдение на SQL сървър

  5. Как да изберете единичен запис в ляво съединение