如何将INT数据库字段与VARCHAR类型进行比较

Nov*_*Net 2 sql t-sql sql-server

我有以下存储过程,而不是编写完整的存储过程,但其中一些是:

@course int = null,
    SET @query = @query + 'Where course_id='+ cast(@course as varchar)
Run Code Online (Sandbox Code Playgroud)

我想知道何时将@course转换为VARCHAR类型,而我course_id在数据库中的类型是INT类型 - 比较是如何进行的?

Rem*_*anu 6

SQL Server中两种不同类型之间的比较如下所示:

  • 首先,根据数据类型优先级的规则比较两种类型的优先:

    优先级较低的数据类型将转换为优先级较高的数据类型

  • 接下来,优先级较低的类型将转换为具有较高优先级的类型

  • 然后在具有较高优先级的类型的原始值与具有较低优先级的类型的转换值之间进行比较

为了便于讨论:a INT(优先级16,高位)和a VARCHAR(优先级27,低位)将通过转换VARCHARto INT然后比较两者来进行比较.

在你的情况下,虽然没有发生转换,因为发生的是该@course值被附加到动态构造的@sql.不用说,这很糟糕.正确的解决方案是将@course作为参数传递给dymnamic SQL调用:

@course INT = null
...
 SET @query = @query + 'Where course_id= @course';
...
exec sp_executesql @sql, '@course int', @course;
Run Code Online (Sandbox Code Playgroud)

这是:

  • 更快:参数化查询而不是硬编码值
  • 更安全:如果代码被重构并且@counter成为可以进行SQL注入的类型,则降低SQL注入的风险
  • 不易出错:没有传播NULL值的风险使整个系统无效@sql