Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Używanie zmiennej z dynamicznym SQL

Masz wiersz AND ( @BG = ''''OR COM.BGName =''' + @BG +''' . `@BG' nie jest zadeklarowane w Twoim Dynamicznym SQL. Musisz go przekazać tak, jak później w tym samym wierszu:

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

Wydaje się jednak, że to zapytanie jest otwarte na wstrzyknięcie SQL; znacznie lepiej byłoby go sparametryzować:

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

Uwaga (ponieważ wiem, że ludzie mają zwyczaj nie czytać komentarzy, które ludzie zostawiają dla nich w ich kodzie) nie mam pojęcia, jaki typ danych dla @BG i @Trans_date jest, więc domyśliłem się, że są to int i date odpowiednio. Musisz to zmienić, jeśli źle zgadłem.

W komentarzach możesz zobaczyć, że musisz sprawdzić, w jaki sposób dodajesz wartości kolumn do zapytania; sposób, w jaki to zrobiłeś może być również otwarty na wstrzykiwanie, ale nie widziałem wcześniejszej części zapytania.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd podczas próby wybrania x wierszy z DB2 (V4R5M0) za pośrednictwem serwera połączonego z serwerem sql przy użyciu funkcji OPENQUERY

  2. Jak użyć pola obliczeniowego w innym polu tego samego zapytania

  3. Nie można zabić wycofywania transakcji SPID w toku

  4. Połączenie JDBC z serwerem MSSQL w trybie uwierzytelniania systemu Windows

  5. Jak dołączyć bazę danych SQL Server z wiersza poleceń