Parametrisierung dynamischer SQL-Abfragen in T-SQL
Bei dynamischen SQL-Abfragen sind Parameter entscheidend, um SQL-Injection-Angriffe zu verhindern und die Typsicherheit zu gewährleisten. Beim Arbeiten mit Parametern in dynamischem T-SQL-SQL ist es wichtig, diese korrekt an die gespeicherte Prozedur sp_executesql zu übergeben.
Problem:
Bedenken Sie die folgende dynamische Abfrage, die erwartet ein UNIQUEIDENTIFIER-Parameter für die WHERE-Klausel:
CREATE PROCEDURE [dbo].[sp_Test1] /* 'b0da56dc-fc73-4c0e-85f7-541e3e8f249d' */ ( @p_CreatedBy UNIQUEIDENTIFIER ) AS DECLARE @sql NVARCHAR(4000) SET @sql =' DECLARE @p_CreatedBY UNIQUEIDENTIFIER SELECT DateTime, Subject, CreatedBy FROM ( SELECT DateTime, Subject, CreatedBy, ROW_NUMBER() OVER(ORDER BY DateTime ) AS Indexing FROM ComposeMail WHERE CreatedBy = @p_CreatedBy /* <--- the problem is in this condition */ ) AS NewDataTable ' EXEC sp_executesql @sql
Wenn diese Abfrage ohne Übergabe des Parameters ausgeführt wird, ergibt sich kein Ergebnis wird zurückgegeben.
Lösung:
Um dieses Problem zu beheben, müssen Parameter an sp_executesql übergeben werden. Ändern Sie die WHERE-Klausel wie folgt:
WHERE CreatedBy = @p
Und übergeben Sie den Parameter mit dem @p-Parameternamen:
EXECUTE sp_executesql @sql, N'@p UNIQUEIDENTIFIER', @p = @p_CreatedBY
Dadurch wird sichergestellt, dass die WHERE-Klauselbedingung den parametrisierten Wert vom Aufrufer verwendet , verhindert SQL-Injection und gewährleistet Typsicherheit.
Das obige ist der detaillierte Inhalt vonWie kann ich dynamische SQL-Abfragen in T-SQL sicher parametrisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!