在SQL Server中,两种不同类型之间的比较是这样进行的:
- 首先,根据数据类型优先级的规则比较这两种类型的优先级:
优先级较低的数据类型将转换为优先级较高的数据类型
接下来,将优先级较低的类型强制转换为优先级较高的类型
然后在优先级较高的类型的原始值和优先级较低的类型的转换后的值之间进行比较
为了便于讨论:将
INT(优先级16,高)和a
VARCHAR(优先级27,低)进行比较,方法是将
VARCHARto强制转换为to
INT,然后将两者进行比较。
在您的情况下,虽然没有发生任何转换,因为发生的情况是该
@course值被附加到了动态构造的上
@sql。不用说,那是不好的。正确的解决方案是将
@courseas作为参数传递给动态SQL调用:
@course INT = null... SET @query = @query + 'Where course_id= @course';...exec sp_executesql @sql, '@course int', @course;
这是:
- 更快 :参数化查询,而不是硬编码值
- 更安全 :如果代码经过重构并且@counter成为可进行SQL注入的类型,则降低SQL注入的风险
- 较少出错 :没有NULL值传播使整个结果无效的风险
@sql



