Sql Server。为什么[几乎]任何类型的字段值在查询/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]

我突然发现,在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]
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,谢谢您提供更多信息。我修改了它,以消除关于口译员实际在做什么的假设。