Ms Sql Server将数字列与字符串值

时间:2018-06-05 09:33:32

标签: sql sql-server

在MS SQL Server中,有什么区别:

select * from Person where Id='7'

select * from Person where Id=7

两个查询返回相同的结果。

ID 类型为 int

我们不应该将int与string进行比较吗?

什么时候应该使用其中一个?

1 个答案:

答案 0 :(得分:4)

始终与相同的数据类型进行比较,避免隐式转换。

SELECT 'Not OK!' WHERE 'text' = 1
-- Result: Conversion failed when converting the varchar value 'text' to data type int.

正如数据类型优先级所述,当数据类型不匹配时,SQL引擎将(在大多数情况下)尝试将最复杂的类型转换为最简单的类型,因此比较更快。在这种情况下(VARCHARINT),它总是将字符串类型转换为int。

此外,在对具有连接和其他操作的隐式转换的SQL进行编码时,最有可能生成与显式转换相同的执行计划。

如果你必须比较不同的类型,记得明确地转换它们,不仅仅是因为前面提到的原因,而且还向下一个开发人员说明列或表达式在数据类型上有所不同。

SELECT 'OK!' WHERE 'text' = CONVERT(VARCHAR(10), 1)

对于某些数据类型,如果您保留隐式转换,则可能会发现不需要的行为。

DECLARE @BitValue1 BIT = NULL
DECLARE @BitValue2 BIT = 1

SELECT
    'Oops!'
WHERE
    ISNULL(@BitValue1, -999) = ISNULL(@BitValue2, -999)

-- Result: Oops! (-999 is being converted to bit, which is 1)