如何解决表存储过滤条件动态拼接SQL时的单引号转义问题
错误根源
- 多余的单引号包裹:你在拼接
@filter1、@filter2的时候额外加了两层单引号,相当于把过滤条件变成了字符串常量拼接在SQL里,而不是作为WHERE子句的一部分执行,这是最直接的错误原因。 - 未处理过滤条件内部的单引号:如果存储的过滤条件本身包含单引号(比如示例里的日期值包裹的单引号),没有转义的话会直接打断动态SQL的语法结构。
修复方案
直接修改动态SQL拼接逻辑,去掉多余的单引号,同时对过滤条件做单引号转义处理,修复后的完整代码如下:
DECLARE @filter1 as varchar(1000) DECLARE @filter2 as varchar(1000) DECLARE File_Cursor CURSOR FOR SELECT filter1, filter2 FROM _table_filters OPEN File_Cursor; FETCH NEXT FROM File_Cursor INTO @filter1, @filter2; WHILE @@FETCH_STATUS = 0 BEGIN declare @sql varchar(8000) = ' select statusdate from t_table where 1=1 '+ REPLACE(@filter1, '''', '''''') +' '+ REPLACE(@filter2, '''', '''''') +' ' exec(@sql) FETCH NEXT FROM File_Cursor INTO @filter1, @filter2; END; CLOSE File_Cursor; DEALLOCATE File_Cursor;
关键修改说明
- 移除了
@filter1、@filter2变量外侧多余的单引号,让过滤条件可以直接作为WHERE子句的逻辑部分生效 - 使用
REPLACE(参数, '''', '''''')把过滤条件内部的单引号转义为两个连续单引号,符合SQL动态拼接的转义规则,不会打断SQL语法结构 - 修复后拼接出来的SQL会变成符合要求的格式:
select statusdate from t_table where 1=1 and startdate > '20200101' and active = 0
内容的提问来源于stack exchange,提问作者Nikka
相关产品推荐
相关产品推荐

