SQL Server中sp_executesql安全拼接含单引号字符串的正确方法是使用参数化:声明参数类型、传入未加引号的变量值(如@name = 'O''Connor'),SQL语句中仅用占位符@name,由系统自动转义。

SQL Server 中 sp_executesql 怎么安全拼接含单引号的字符串
直接用 + 拼接用户输入进动态 SQL,单引号会断语法,报错 Incorrect syntax near 'xxx'。根本解法不是“多加几个单引号”,而是让参数真正走参数化——sp_executesql 支持参数占位符,但必须把参数名、类型、值三者对齐。
- 变量值传入时不要手动加引号:
@name = 'O''Connor'是合法字符串值,传给sp_executesql时直接作为@name参数,内部自动处理转义 - SQL 字符串里只写参数占位符:
N'SELECT * FROM users WHERE last_name = @name',不能写成'... = ''' + @name + '''' - 类型声明必须精确匹配:如果
@name是varchar(50),调用时N'@name varchar(50)'缺一不可,否则可能隐式转换失败或截断
MySQL 存储过程中 CONCAT 拼接字符串时单引号/反斜杠怎么逃
MySQL 没有等效于 sp_executesql 的原生参数化执行接口,PREPARE + EXECUTE 只接受变量名,不支持运行时绑定值。所以必须手动转义,但别用 REPLACE(str, "'", "''") —— 这是 SQL Server 写法,MySQL 用两个单引号不生效。
- 正确做法是用
REPLACE(str, "'", "\'")配合SET @sql = CONCAT("SELECT * FROM t WHERE name = '", @escaped_name, "'") - 更稳妥的是用
QUOTE()函数:SET @sql = CONCAT("SELECT * FROM t WHERE name = ", QUOTE(@name)),它自动加单引号并转义内部所有危险字符(包括
