我有以下存储过程,没有编写完整的存储过程,但其中一些是:
@course int = null,
SET @query = @query + 'Where course_id='+ cast(@course as varchar)
我想知道何时将@course 转换为 VARCHAR 类型,而数据库中的 course_id
是 INT 类型 - 如何进行比较?
最佳答案
SQL Server中两种不同类型的比较是这样进行的:
首先根据Data Type Precedence的规则比较两种类型的优先级:
the data type with the lower precedence is converted to the data type with the higher precedence
接下来将优先级较低的类型转换为优先级较高的类型
然后比较优先级较高的类型的原始值和优先级较低的类型的转换值
为了便于讨论:INT
(优先级 16,高)和 VARCHAR
(优先级 27,低)将通过转换 VARCHAR
到 INT
然后比较两者。
在您的情况下,虽然没有发生转换,因为发生的是 @course
值附加到动态构造的 @sql
。不用说,那很糟糕。正确的解决方案是将 @course
作为参数传递给动态 SQL 调用:
@course INT = null
...
SET @query = @query + 'Where course_id= @course';
...
exec sp_executesql @sql, '@course int', @course;
这是:
- 更快:参数化查询而不是硬编码值
- 更安全:如果代码被重构并且@counter 成为可以携带 SQL 注入(inject)的类型,则降低 SQL 注入(inject)的风险
- 不易出错:没有 NULL 值传播使整个
@sql
无效的风险
关于sql - INT 数据库字段如何与 VARCHAR 类型进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4147215/