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

标签 sql sql-server tsql

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

@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,低)将通过转换 VARCHARINT 然后比较两者。

在您的情况下,虽然没有发生转换,因为发生的是 @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/

相关文章:

mysql - 如何让 PhpStorm 理解同一个项目中 HEREDOC 中的不同 SQL 方言

sql - 我们可以在 SELECT 和 FROM 之间写子查询吗

php - 在 SQL QUERY 不一致的 WHERE 子句中将 NOT IN 与 AND 连接

sql - 使用 VDF 和 MERTECH 从 SQL Server 与 PostgreSQL 获取日期

c# - 从 .NET 中的 DBPedia 大转储文件中提取内容

sql-server-2008 - 从上一行中的非空值更新空列值

sql - 如何计算两个日期之间的年龄/年数

mysql - 覆盖sql表结构

sql - 并行性不会带来任何性能提升

sql - 为什么我的小数值在 SQL 插入中会四舍五入为整数?