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
dboPräfix beim Erstellen / Referenzieren von Objekten. - Tabellen- und Spaltennamen sind
NVARCHARund 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 ONhinzugefügt als Schutz vor Netzwerk-Overhead und möglicherweise dem Senden fehlerhafter Ergebnissätze an den Client.@sqlsollte immerNVARCHARsein .- Verwenden Sie
QUOTENAMEUm 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).