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

sql lagret procedureargument som parameter for dynamisk forespørgsel

Her er et meget mere sikkert alternativ:

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

Hvad har jeg ændret?

  1. Brug altid dbo præfiks ved oprettelse/henvisning til objekter.
  2. Tabel- og kolonnenavne er NVARCHAR og kan være længere end 150 tegn. Meget sikrere at tillade, at parametrene passer til et bord, som nogen kan tilføje i fremtiden.
  3. Tilføjet SET NOCOUNT ON som en vagt mod netværksoverhead og potentielt afsendelse af fejlagtige resultatsæt til klienten.
  4. @sql skal altid være NVARCHAR .
  5. Brug QUOTENAME omkring enhedsnavne såsom tabeller eller kolonner for at hjælpe med at forhindre SQL-injektion og også for at beskytte sig mod dårligt valgte navne (f.eks. søgeord).
  6. Brug korrekte parametre, hvor det er muligt (igen for at hjælpe med at forhindre SQL-injektion, men også for at undgå at skulle foretage alle former for escape-afgrænsere på strengparametre).


  1. Angivelse af kolonnenavn som en parameter i SELECT-sætning?

  2. Ugyldigt parameternummer, PDO ved dubletopdatering mislykkes

  3. MySQL Trigger med SELECT-sætning

  4. Live opdatering MySQL Data