执行[dbo].[usp_compare_metadata]存储过程报AND附近非布尔类型表达式错误
存储过程执行报错问题原因及解决方案
错误原因
- 核心问题是传入的
@Where参数格式不符合存储过程的设计要求。存储过程中会将@Where参数直接拼接在查询sys.tables的WHERE子句之后,要求传入的是合法的布尔判断表达式,而你传入的是纯表名字符串t_compliance_control,拼接后生成的动态SQL为:
select name from db05.sys.tables where t_compliance_control AND name not in (...) order by 1
WHERE子句后直接跟表名,SQL无法将其识别为判断条件,就会抛出「预期条件的上下文中指定了非布尔类型的表达式」的错误。
- 存储过程本身的参数注释也明确标注了@Where的正确用法示例:
where name like 't_product_arrears%',你传入的值不符合该格式要求。
解决方案
场景1:仅需要对比t_compliance_control单张表
修改调用时的@Where参数值为完整的判断条件:
exec [dbo].[usp_compare_metadata] @source_db = 'db05', @target_db = 'db01', @Where = 'name = ''t_compliance_control''', -- 注意单引号转义 @show_diff = 0, @Control = '-d'
场景2:需要匹配某一类规则的表
按照注释示例的格式传入模糊匹配条件即可,比如匹配所有前缀为t_compliance的表:
@Where = 'name like ''t_compliance%'''
优化建议(可选)
可以在存储过程开头增加@Where参数的合法性校验逻辑,比如判断参数非空时是否包含name关键字,避免后续拼接SQL出错,同时也能降低SQL注入风险。
内容的提问来源于stack exchange,提问作者Pranay Kumar
相关产品推荐
相关产品推荐

