如何编写动态SQL存储过程_使用sp_executesql执行灵活查询

sp_executesql 更安全因其支持参数化防SQL注入;EXEC() 拼接字符串易受注入攻击,外部输入须全转为参数,动态对象名需白名单或QUOTENAME()处理,参数声明须用NVARCHAR(MAX),执行计划缓存依赖SQL字符串完全一致。sp_executesql 为什么比 EXEC() 更安全因为 sp_executesql 支持参数化,能天然防 SQL 注入;而拼接字符串后用 EXEC() 执行,一旦变量没过滤干净,username = 'admin' OR 1=1 --' 这种输入就直接穿透进查询里。常见错误现象:用 EXEC(@sql) 处理用户传入的排序字段或搜索关键词,本地测试没问题,上线后被扫出注入漏洞。必须把所有外部输入(尤其是 @search_term、@order_by)转成 sp_executesql 的参数,而不是拼进字符串动态列名、表名、排序字段不能参数化------它们得走白名单校验或 QUOTENAME() 包裹,比如 QUOTENAME(@sort_column)sp_executesql 的参数声明必须是 NVARCHAR 类型,且长度足够(推荐 NVARCHAR(MAX)),否则会截断导致语法错误动态 WHERE 条件怎么写才不崩最常踩的坑是空条件拼出 WHERE AND ... 或漏掉 1=1 导致语法错误。别手动拼 AND,用逻辑组合更稳。使用场景:后台筛选接口,多个可选字段(姓名、部门、状态、日期范围)。初始化 @sql 为 N'SELECT * FROM users WHERE 1=1',后续每个条件都以 AND ... 追加对每个可选参数,先判断是否非空/有效,再追加对应子句,例如:IF @name IS NOT NULL SET @sql += N' AND name LIKE @name_param'日期范围要小心 NULL:用 IS NULL 判断边界值,别直接拼 BETWEEN NULL AND ...,SQL Server 会跳过整个条件输出参数和返回结果集能一起用吗可以,但要注意顺序和声明方式:sp_executesql 的参数列表里,输出参数必须显式标出 OUTPUT,而且得在调用时也带 OUTPUT 关键字,否则值不会回传。 幻导航网 发现优质实用网站,开启网络探索之旅!

相关推荐
汉字萌萌哒10 小时前
Python turtle模块绘制花朵贺卡的基础步骤
python
知识分享小能手10 小时前
Flask入门学习教程,从入门到精通, Flask模板 — 完整知识点与案例代码 (3)
python·学习·flask
接着奏乐接着舞10 小时前
java lambda表达式
java·开发语言·python
风之所往_10 小时前
Python 3.3 新特性全面总结
python
接着奏乐接着舞10 小时前
vscode 给 Maven 启动的 JVM 加上 `-Dfile.encoding=UTF-8`
jvm·vscode·maven
Dicky-_-zhang10 小时前
微服务安全防护实战:OAuth2与JWT鉴权
java·jvm
超梦dasgg11 小时前
Java 生产环境 JVM 调优实战
java·开发语言·jvm
EntyIU11 小时前
创建FastAPI项目步骤
网络·python·fastapi
白雪落青衣11 小时前
BUU SQL COURSE 1 sql注入
数据库·sql·web安全·网络安全
隔壁大炮11 小时前
MNE-Python 第4天学习笔记:数据预处理(一)—— 滤波与重参考
python·eeg·mne·脑电数据处理