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

argumen prosedur tersimpan sql sebagai parameter untuk kueri dinamis

Ini adalah alternatif yang jauh lebih aman:

ALTER PROCEDURE dbo.queryfunctions 
  @Tabname NVARCHAR(511),
  @colname NVARCHAR(128),
  @valuesname VARCHAR(150)
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @sql NVARCHAR(MAX);

  SET @sql = 'SELECT * FROM ' + @Tabname 
           + ' WHERE ' + QUOTENAME(@colname) + ' = @v';

  EXEC sp_executesql @sql, N'@v VARCHAR(150)', @valuesname;
END
GO

EXEC dbo.queryfunctions N'dbo.education', N'eduChildName', 'Revathi';

Apa yang saya ubah?

  1. Selalu gunakan dbo awalan saat membuat / mereferensikan objek.
  2. Nama tabel dan kolom adalah NVARCHAR dan bisa lebih dari 150 karakter. Jauh lebih aman untuk mengizinkan parameter mengakomodasi tabel yang mungkin ditambahkan seseorang di masa mendatang.
  3. Menambahkan SET NOCOUNT ON sebagai pelindung terhadap overhead jaringan dan berpotensi mengirimkan kumpulan hasil yang salah ke klien.
  4. @sql harus selalu NVARCHAR .
  5. Gunakan QUOTENAME seputar nama entitas seperti tabel atau kolom untuk membantu menggagalkan injeksi SQL dan juga untuk mencegah nama yang dipilih dengan buruk (misalnya kata kunci).
  6. Gunakan parameter yang tepat jika memungkinkan (sekali lagi untuk membantu menggagalkan injeksi SQL tetapi juga untuk menghindari keharusan melakukan segala macam pelepasan pembatas pada parameter string).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengubah string koneksi secara dinamis

  2. Perbarui jika ada nama lain masukkan - di SQL Server

  3. Pilih catatan dari awal bulan hingga tanggal saat ini

  4. Mendapatkan nomor minggu dari tanggal di MS SQL Server 2005?

  5. Tidak dapat men-debug prosedur tersimpan SQL Server 2005 di Visual Studio Team System 2008