Varchar 类型等于数字
Varchar type equals numeric
我在 SQL 服务器中创建了 table 服务器:
create table tblVehicleRegistration (
vehicleid int identity(1,1) primary key,
registrationNumber varchar(5),
registrationDate date,
userId int
)
并执行如下查询:
select UserId from tblVehicleRegistration
where registrationNumber = 20012
and registrationDate > '2016-01-01'
这里奇怪的是registrationNumber
是varchar
数据类型,20012是numeric
,但是执行了查询。这样写的查询是不是错了?实际上这是 70-761 考试的试题,我需要知道你的意见。这些呢:
select UserId from tblVehicleRegistration
where cast(registrationNumber as int) = 20012
and registrationDate > '2016-01-01'
select UserId from tblVehicleRegistration
where registrationNumber = '20012'
and registrationDate > '2016-01-01'
当您将字符串与数字进行比较时,字符串 将转换为数字。这是根据 SQL.
的规则
这通常会导致转换错误。因此,如果无法转换任何值,您可能会收到错误消息。当这些发生在隐式转换时,它们真的很难找到。所以,我强烈建议避免隐式转换。
隐式转换也会使优化器更难识别适当的索引,从而影响性能。
最佳解决方案是使用正确的类型存储数据。如果没有前导零且值为数字,则将其存储为数字。
否则,请确保比较的是字符串:registrationNumber = '20012'
。
我在 SQL 服务器中创建了 table 服务器:
create table tblVehicleRegistration (
vehicleid int identity(1,1) primary key,
registrationNumber varchar(5),
registrationDate date,
userId int
)
并执行如下查询:
select UserId from tblVehicleRegistration
where registrationNumber = 20012
and registrationDate > '2016-01-01'
这里奇怪的是registrationNumber
是varchar
数据类型,20012是numeric
,但是执行了查询。这样写的查询是不是错了?实际上这是 70-761 考试的试题,我需要知道你的意见。这些呢:
select UserId from tblVehicleRegistration
where cast(registrationNumber as int) = 20012
and registrationDate > '2016-01-01'
select UserId from tblVehicleRegistration
where registrationNumber = '20012'
and registrationDate > '2016-01-01'
当您将字符串与数字进行比较时,字符串 将转换为数字。这是根据 SQL.
的规则这通常会导致转换错误。因此,如果无法转换任何值,您可能会收到错误消息。当这些发生在隐式转换时,它们真的很难找到。所以,我强烈建议避免隐式转换。
隐式转换也会使优化器更难识别适当的索引,从而影响性能。
最佳解决方案是使用正确的类型存储数据。如果没有前导零且值为数字,则将其存储为数字。
否则,请确保比较的是字符串:registrationNumber = '20012'
。