我有一张像这样的桌子
CREATE TABLE MyTable (
[MyTableID] [int] NOT NULL,
[Description] [varchar](50) NOT NULL,
CONSTRAINT [PK_AddressType] PRIMARY KEY CLUSTERED (
[MyTableID] ASC
)
) ON [PRIMARY]
即使我在单引号中包含字段值,有人可以解释为什么以下查询有效吗?
SELECT *
FROM MyTable
WHERE MyTableID = '1'
这是SQL Server特有的功能吗?它是ANSI / SQL?
答案 0 :(得分:6)
您所演示的内容通常被称为隐式数据转换 - 数据会自动转换为要比较的列的数据类型。因为值为“1”的字符串可以转换为值为1的数值数据类型,所以工作正常。隐式数据类型转换可以根据此处的precedence list进行。
明确的数据转换是指您使用CAST or CONVERT等功能时。
我知道的所有数据库都支持String to numeric(反之亦然) - SQL Server,Oracle,MySQL,PostgreSQL ...... CAST函数是ANSI,IIRC。其他数据类型不灵活 - 日期和时间例如,日期时间。
答案 1 :(得分:3)
除了OMG小马的回答。
隐式数据类型转换可以根据此处的precedence list进行。
当谓词中常量或参数的数据类型的优先级高于列的优先级时,它们可能是性能问题的根源。在这种情况下,列值需要进行隐式转换,这意味着不能使用索引。