Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Menggunakan Variabel dengan SQL Dinamis

Anda memiliki baris AND ( @BG = ''''OR COM.BGName =''' + @BG +''' . `@BG' tidak dideklarasikan dalam SQL Dinamis Anda. Anda harus meneruskannya seperti yang Anda lakukan nanti di baris yang sama:

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

Kueri ini, bagaimanapun, tampaknya terbuka untuk injeksi SQL; Anda akan jauh lebih baik memparametrikannya:

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

Catatan (seperti yang saya tahu orang memiliki kebiasaan untuk tidak membaca komentar yang ditinggalkan orang untuk mereka dalam kode mereka) Saya tidak tahu apa tipe data untuk @BG dan @Trans_date adalah, jadi saya telah menduga mereka adalah int dan date masing-masing. Anda harus mengubah ini, jika saya salah menebak.

Anda dapat melihat dari komentar bahwa Anda perlu melihat bagaimana Anda menambahkan nilai kolom ke kueri Anda juga; cara Anda melakukannya mungkin juga terbuka untuk injeksi, tetapi saya belum melihat bagian awal dari kueri Anda.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pemindaian Mundur Indeks SQL Server:Pemahaman dan Penyetelan Kinerja

  2. SQL Server 2008:menyalin isi semua tabel dari satu database ke database lain

  3. Kapan saya harus menggunakan CROSS APPLY daripada INNER JOIN?

  4. Mengapa CTE ini jauh lebih lambat daripada menggunakan tabel temp?

  5. Saat menjalankan prosedur tersimpan, apa keuntungan menggunakan CommandType.StoredProcedure dibandingkan menggunakan CommandType.Text?