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?
- Verwenden Sie immer
dbo
Präfix beim Erstellen / Referenzieren von Objekten. - 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. SET NOCOUNT ON
hinzugefügt als Schutz vor Netzwerk-Overhead und möglicherweise dem Senden fehlerhafter Ergebnissätze an den Client.@sql
sollte immerNVARCHAR
sein .- 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. - 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).