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

argument procedury składowanej sql jako parametr dla zapytania dynamicznego

Oto znacznie bezpieczniejsza alternatywa:

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

Co zmieniłem?

  1. Zawsze używaj dbo prefiks podczas tworzenia / odwoływania się do obiektów.
  2. Nazwy tabel i kolumn to NVARCHAR i może być dłuższe niż 150 znaków. O wiele bezpieczniejsze jest umożliwienie parametrom dostosowania do tabeli, którą ktoś może dodać w przyszłości.
  3. Dodano SET NOCOUNT ON jako ochrona przed obciążeniem sieci i potencjalnie wysyłaniem błędnych zestawów wyników do klienta.
  4. @sql powinien zawsze mieć wartość NVARCHAR .
  5. Użyj QUOTENAME wokół nazw jednostek, takich jak tabele lub kolumny, aby pomóc udaremnić wstrzykiwanie SQL, a także chronić przed źle dobranymi nazwami (np. słowa kluczowe).
  6. Używaj właściwych parametrów tam, gdzie to możliwe (znowu, aby pomóc udaremnić wstrzykiwanie SQL, ale także uniknąć konieczności wykonywania wszelkiego rodzaju unikania ograniczników w parametrach ciągu).


  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, jeśli rekord jest równy rekordowi przed nim

  2. Wybieranie wartości z tabeli jako nagłówków kolumn

  3. Jak zaszyfrować funkcję zdefiniowaną przez użytkownika w SQL Server

  4. Dynamiczne maskowanie danych w SQL Server dla początkujących

  5. Dlaczego otrzymuję Nieprawidłową próbę wywołania HasRows, gdy czytnik jest zamknięty z otwartym połączeniem?