Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

argomento della stored procedure sql come parametro per la query dinamica

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?

  1. Usa sempre dbo prefisso durante la creazione/riferimento a oggetti.
  2. 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.
  3. Aggiunto SET NOCOUNT ON come protezione contro il sovraccarico di rete e il potenziale invio di set di risultati errati al client.
  4. @sql dovrebbe essere sempre NVARCHAR .
  5. 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).
  6. 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).