1

我突然发现,在 SQL Server (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语句中使用它们。这个SO 问题

Q2:某些类型有限制吗?Q3:这是可靠的方式还是CAST推荐的方式?

4

2 回答 2

1

SQL Server 与大多数(所有?)品牌的 SQL 一样,会自动尝试将事物转换为正确的类型。这是非常标准的行为。

在上述情况下应该是可靠的。在updateandselect语句中,必须转换为的类型是已知的(根据表的列定义)。

但是,当它是更复杂查询的一部分时,自动转换可能会引入一些微妙的问题。某些类型的 SQL 会出现这样的语句问题:

select case when foo=1 then 0 else 'a' end from table

在这种情况下,结果类型不一定可以接受所有类型的结果,因此在尝试分配“a”时可能会失败。在复杂语句中依赖自动转换时要小心。在这种情况下,最好明确说明。

将所有内容作为字符串传入的另一个潜在问题是,如果您不小心传入了非数字值,则会出现错误。

于 2013-02-28T12:18:21.483 回答
1

如果您检查CASTandCONVERT主题,您会发现一个方便的表格:

在此处输入图像描述

您会注意到,所有其他类型都支持 charand进行转换varchar,并且其中只有少数需要显式强制转换。对于某些类型,没有明显的方法来键入该类型的文字,因此允许从字符串进行隐式转换是有意义的。

(但是,哦,我多么希望转换为datetime需要一个带有格式代码的显式案例......)

于 2013-02-28T13:34:09.423 回答