Ecco un'alternativa molto più sicura:
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';
Cosa ho cambiato?
- Usa sempre
dbo
prefisso durante la creazione/riferimento a oggetti. - I nomi di tabelle e colonne sono
NVARCHAR
e può essere più lungo di 150 caratteri. Molto più sicuro consentire ai parametri di ospitare una tabella che qualcuno potrebbe aggiungere in futuro. - Aggiunto
SET NOCOUNT ON
come protezione contro il sovraccarico di rete e il potenziale invio di set di risultati errati al client. @sql
dovrebbe essere sempreNVARCHAR
.- Usa
QUOTENAME
attorno a nomi di entità come tabelle o colonne per aiutare a contrastare l'iniezione di SQL e anche per proteggersi da nomi scelti male (ad es. parole chiave). - Utilizza i parametri appropriati ove possibile (di nuovo per aiutare a contrastare l'iniezione di SQL ma anche per evitare di dover eseguire tutti i tipi di escape dei delimitatori sui parametri di stringa).