Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Argument für gespeicherte Prozeduren als Parameter für dynamische Abfragen

Hier ist eine viel sicherere Alternative:

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

Was habe ich geändert?

  1. Verwenden Sie immer dbo Präfix beim Erstellen / Referenzieren von Objekten.
  2. Tabellen- und Spaltennamen sind NVARCHAR und kann länger als 150 Zeichen sein. Es ist viel sicherer, die Parameter für eine Tabelle zuzulassen, die jemand in der Zukunft hinzufügen könnte.
  3. SET NOCOUNT ON hinzugefügt als Schutz vor Netzwerk-Overhead und möglicherweise dem Senden fehlerhafter Ergebnissätze an den Client.
  4. @sql sollte immer NVARCHAR sein .
  5. Verwenden Sie QUOTENAME Um Entitätsnamen wie Tabellen oder Spalten herum, um SQL-Injection zu vereiteln und auch vor schlecht gewählten Namen (z. B. Schlüsselwörtern) zu schützen.
  6. Verwenden Sie nach Möglichkeit die richtigen Parameter (wiederum, um die SQL-Einschleusung zu vereiteln, aber auch um zu vermeiden, dass alle Arten von Trennzeichen für Zeichenfolgenparameter maskiert werden müssen).