字符串拼接 SET @sql = 'SELECT * FROM t WHERE name=''' + @name + '''' 存在 **SQL 注入風險**:若 @name = '' OR 1=1 --,語句變為 WHERE name='' OR 1=1 --',繞過過濾。
DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM t WHERE name LIKE @p';
DECLARE @params NVARCHAR(MAX) = N'@p NVARCHAR(100)';
EXEC sp_executesql @sql, @params, @p = @name;
@sql 中只包含**靜態結構**(關鍵字、列名、運算符),無用戶輸入。識別符無法參數化,必須**白名單驗證**後拼接:
IF @orderCol IN ('col1','col2','col3')
SET @sql += N' ORDER BY ' + QUOTENAME(@orderCol);
**風險在於「未參數化的用戶輸入」**,而非動態 SQL 本身。規範使用 sp_executesql + 白名單,即可滿足 DBA 合規要求。|