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

sql аргумент за съхранена процедура като параметър за динамична заявка

Ето една много по-безопасна алтернатива:

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';

Какво промених?

  1. Винаги използвайте dbo префикс при създаване/препратка към обекти.
  2. Имената на таблици и колони са NVARCHAR и може да е по-дълъг от 150 знака. Много по-безопасно е да се позволи на параметрите да поемат таблица, която някой може да добави в бъдеще.
  3. Добавен SET NOCOUNT ON като защита срещу натоварване на мрежата и потенциално изпращане на грешни набори от резултати към клиента.
  4. @sql винаги трябва да бъде NVARCHAR .
  5. Използвайте QUOTENAME около имена на обекти като таблици или колони, за да се предотврати инжектирането на SQL и също така да се предпазят от неправилно избрани имена (напр. ключови думи).
  6. Използвайте правилни параметри, когато е възможно (отново, за да предотвратите SQL инжектирането, но също така и за да избегнете необходимостта да правите всякакви видове екраниране на разделители на параметри на низ).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server отчита броя на отделните стойности във всяка колона на таблица

  2. Как да добавя колона с пореден номер към данните за резултатите?

  3. Вътрешни елементи за репликация на транзакции на SQL сървър – част 2

  4. Функцията за дял COUNT() OVER е възможна с помощта на DISTINCT

  5. Броят на седмиците и частичните седмици между два дни е изчислен неправилно