sql >> Database >  >> RDS >> Sqlserver

sql opgeslagen procedure-argument als parameter voor dynamische query

Hier is een veel veiliger alternatief:

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

Wat heb ik veranderd?

  1. Gebruik altijd dbo voorvoegsel bij het maken van / verwijzen naar objecten.
  2. Tabel- en kolomnamen zijn NVARCHAR en kan langer zijn dan 150 tekens. Veel veiliger om de parameters toe te staan ​​aan een tafel die iemand in de toekomst zou kunnen toevoegen.
  3. Toegevoegd SET NOCOUNT ON als bescherming tegen netwerkoverhead en mogelijk het verzenden van foutieve resultatensets naar de klant.
  4. @sql moet altijd NVARCHAR . zijn .
  5. Gebruik QUOTENAME rond entiteitsnamen zoals tabellen of kolommen om SQL-injectie te helpen tegengaan en ook om te waken tegen slecht gekozen namen (bijv. trefwoorden).
  6. Gebruik waar mogelijk de juiste parameters (opnieuw om SQL-injectie te voorkomen, maar ook om te voorkomen dat u allerlei soorten scheidingstekens op tekenreeksparameters moet omzeilen).


  1. Tijdstempelinterval

  2. Kolomnamen en typen van een opgeslagen procedure ophalen?

  3. MySQL-tijdzone wijzigen?

  4. Sequelize geospatial query:vind n punten die het dichtst bij een locatie liggen