Sql Server。为什么[几乎]任何类型的字段值在查询/DML中都可以被视为带引号的字符串?
我突然发现,在SQLServer(2000)中,任何字段类型的值都可以被视为带引号的字符串(在查询或DML中) 问题: 这是正常行为还是意外成功的结果Sql Server。为什么[几乎]任何类型的字段值在查询/DML中都可以被视为带引号的字符串?,sql,sql-server,database,casting,sql-server-2000,Sql,Sql Server,Database,Casting,Sql Server 2000,我突然发现,在SQLServer(2000)中,任何字段类型的值都可以被视为带引号的字符串(在查询或DML中) 问题: 这是正常行为还是意外成功的结果 Example: CREATE TABLE [Test_table] ( [int_field] [int] NULL , [float_field] [float] NULL , [date_field] [datetime] NULL , [id] [int] NOT NULL ) ON [PRIMARY]
Example:
CREATE TABLE [Test_table] (
[int_field] [int] NULL ,
[float_field] [float] NULL ,
[date_field] [datetime] NULL ,
[id] [int] NOT NULL
) ON [PRIMARY]
GO
update test_table set int_field = 100, float_field = 10.01, date_field = CAST('2013-11-10' AS DATETIME) where id = 1
update test_table set int_field = '200', float_field = '20.02', date_field = '2014-12-10' where id = '2'
select * from test_table where id in ('1', 2) -- WHY '1' DOES WORK!???
为什么我需要这个?
一个存储过程将270多个参数作为整型文本(XML或定界符自定义序列化或类似于Len1+value1+len2+value2+…)发送到一个存储过程中,然后解析和提取所有所需的值,并在UPDATE
语句中使用它们。这个
问题2:某些类型有任何限制吗?
问题3:这是一种可靠的方法,还是建议使用CAST
方法?与大多数(所有?)品牌的SQL一样,SQL Server会自动尝试将内容转换为正确的类型。这是相当标准的行为
在上述情况下,它应该是可靠的。在update
和select
语句中,必须转换为的类型是已知的(从表的列定义中)
然而,当自动转换是更复杂查询的一部分时,它可能会引入一些微妙的问题。某些类型的SQL语句会出现以下问题:
select case when foo=1 then 0 else 'a' end from table
在这种情况下,结果类型不一定能够接受所有类型的结果,因此当它尝试分配“a”时可能会失败。在复杂语句中依赖自动转换时要小心。在这种情况下,最好是明确说明
将所有内容作为字符串传入的另一个潜在问题是,如果意外传入非数字值,则会出现错误。如果查看该主题,您会发现一个方便的表格:
您将注意到,其他每种类型都支持从char
和varchar
进行转换,其中只有少数类型需要显式强制转换。对于某些类型,没有明显的方法来键入该类型的文本,因此允许从字符串进行隐式转换是有意义的
(但是哦,我多么希望转换为
datetime
需要一个带有格式代码的显式case…您的case
示例是错误的。CASE
表达式的结果类型始终是固定的,并且遵循THEN
(和ELSE
)子句中所有可能类型之间的优先规则。您显示的表达式的结果只能是int
类型。翻译不“猜”。因此,它只能(在本例中)产生0
或转换error@Damien_The_Unbeliever,谢谢您提供更多信息。我修改了它,以消除关于口译员实际在做什么的假设。