sql >> Databasteknik >  >> RDS >> Sqlserver

sql lagrad procedurargument som parameter för dynamisk fråga

Här är ett mycket säkrare 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';

Vad ändrade jag?

  1. Använd alltid dbo prefix när du skapar / refererar till objekt.
  2. Tabell- och kolumnnamn är NVARCHAR och kan vara längre än 150 tecken. Mycket säkrare att tillåta parametrarna att passa ett bord som någon kan lägga till i framtiden.
  3. Lägg till SET NOCOUNT ON som ett skydd mot nätverkskostnader och eventuellt skicka felaktiga resultatuppsättningar till klienten.
  4. @sql ska alltid vara NVARCHAR .
  5. Använd QUOTENAME runt entitetsnamn som tabeller eller kolumner för att motverka SQL-injektion och även för att skydda sig mot dåligt valda namn (t.ex. nyckelord).
  6. Använd korrekta parametrar där det är möjligt (igen för att hjälpa till att motverka SQL-injektion men också för att undvika att behöva göra alla typer av escape-avgränsare på strängparametrar).


  1. Hur skulle jag formulera en infogningsfråga i en annan databas med postgres_fdw?

  2. PHP - Använder PDO med IN-klausul array

  3. Hur man får året från en Datetime-kolumn i MySQL

  4. Hur lägger man till en positiv heltalsrestriktion till en heltalskolumn i MySQL?