www.350.vipConvert数据类型转变,数据类型转变

隐式转换

隐式转换指那些没有指定 CAST 或 CONVERT
函数的转换。显式转换指那些需要指定 CAST 或 CONVERT
函数的转换。以下图例显示了可对 SQL Server
系统提供的数据类型执行的所有显式和隐式数据类型转换。其中包括
xmlbigintsql_variant。不存在对 sql_variant
数据类型的赋值进行的隐式转换,但是存在转换为 sql_variant
的隐式转换。

www.350.vip 1

datetimeoffset 与字符类型 charvarcharnchar
nvarchar 之间转换时,转换后的时区偏移量部分的 HH 和 MM
都应始终为两个数字,例如 -08:00。

注意:因为 Unicode
数据始终使用偶数个字节,所以在 binaryvarbinary 与支持
Unicode
的数据类型之间进行转换时会使用警告。例如,以下转换不返回十六进制值
41;而是返回
4100:SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary)

1、数据类型转换:

  • (1)两种转换场合:
  • A:当两个结果集之间的数据进行比较或联和(union)的时候,如果两个结果集的数据类型不同时必须进行转换。
  • B:将Transact-SQL
    得结果集返回给程序中的变量时,须将结果集的类型从SQL
    Server数据类型转换为变量的数据类型。
  • (2)两种转换方式:
  • A:自动进行的隐性转换(对于用户是不可见的)。 如:一个 smallint
    变量和 int 变量比较时,将smallint 变量在比较前被隐性转换成 int
    变量。
  • B:用户提供的显式转换(使用 CAST 或 CONVERT 函数进行显式转换)。

注意

A:目标数据类型不能使用别名数据类型。
nchar、nvarchar、char、varchar、binary 或 varbinary

B:目标数据格式的样式在下列类型间转换时才有效

(1)datetime 或 smalldatetime
数据转换成字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar
数据类型)

(2)已知日期或时间格式的字符数据转换成 datetime 或 smalldatetime
数据,或是字符串格式

(3)用于将 float、real、money 或 smallmoney
数据转换成字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar
数据类型)。

float 和 real 样式

如果 expression 为 floatreal,则 style
可以为下表中显示的值之一。其他值作为 0 进行处理。

输出

0(默认值)

最多包含 6 位。根据需要使用科学记数法。

1

始终为 8 位值。始终使用科学记数法。

2

始终为 16 位值。始终使用科学记数法。

126, 128, 129

为了保持向后兼容而包括在内,在以后的版本中可能不推荐使用。

(1)大值数据类型

大值数据类型表现出与小值数据类型相同的隐式和显式转换行为,特别是
varcharnvarcharvarbinary
数据类型。但是,应该考虑以下原则:

  • imagevarbinary(max)
    的转换与反向转换是隐式转换,text
    varchar(max)ntextnvarchar(max)
    之间的转换也是隐式转换。
  • 从大值数据类型(如 varchar(max))到小值数据类型(如
    varchar)的转换是隐式转换,但如果大值相对于指定长度的小值数据类型显得太大,则产生截断。
  • varcharnvarcharvarbinary
    到其相应的大值数据类型的转换都是隐式执行的。
  • sql_variant 数据类型到大值数据类型的转换是显式转换。
  • 大值数据类型不能转换为 sql_variant 数据类型。
  • ##### (2)xml 数据类型

    当您将 xml
    数据类型显式或隐式转换为字符串或二进制数据类型时,xml
    数据类型的内容将根据一组规则进行序列化。

    (3)文本和图像数据类型

    不支持对 textimage 数据类型进行自动数据类型转换。可将
    text 数据显式转换为字符数据,将 image 数据转换为 binary
    varbinary,但最大长度是 8000
    字节。如果试图进行不正确的转换,如将包含字母的字符表达式转换为
    int,则 SQL Server 将返回错误消息。

    ##### (4)输出的排序规则

    如果 CAST 或 CONVERT
    的输出是字符串,并且输入也是字符串,则输出将与输入具有相同的排序规则和排序规则标签。如果输入不是字符串,则输出采用数据库的默认排序规则以及强制默认的排序规则标签。请参阅排序规则优先级
    (Transact-SQL).aspx)。

    若要为输出分配不同的排序规则,请将 COLLATE 子句应用于 CAST 或
    CONVERT 函数的结果表达式。例如:

    SELECT CAST('abc' AS varchar(5)) COLLATE French_CS_AS

    ##### (5)截断结果和舍入结果

    将字符或二进制表达式(charncharnvarcharvarcharbinary

    varbinary)转换为其他数据类型的表达式时,可截断数据,仅显示部分数据,或返回错误(因为结果太短而无法显示)。除了下表显示的转换,其他到
    charvarcharncharnvarcharbinary
    varbinary 的转换都将被截断。

xml 数据类型

当您将 xml 数据类型显式或隐式转换为字符串或二进制数据类型时,xml
数据类型的内容将根据一组规则进行序列化。有关这些规则的信息,请参阅 XML
数据的序列化。有关如何从 XML 转换为 CLR
用户定义类型的信息,请参阅对用户定义类型执行操作。有关如何从其他数据类型转换到
xml 数据类型的信息。

3、备注(来着MSDN.aspx))

 

被转换的数据类型 转换为的数据类型 结果

intsmallinttinyint

char

*

 

varchar

*

 

nchar

E

 

nvarchar

E

moneysmallmoneynumericdecimalfloatreal

char

E

 

varchar

E

 

nchar

E

 

nvarchar

E

* = 结果长度太短而无法显示。E = 因为结果长度太短无法显示而返回错误。

SQL Server
仅保证往返转换(即从原始数据类型进行转换后又返回原始数据类型的转换)在各版本间产生相同值。以下示例显示的即是这样的往返转换:

DECLARE @myval decimal (5, 2)
SET @myval = 193.57
SELECT CAST(CAST(@myval AS varbinary(20)) AS decimal(10,5))
-- Or, using CONVERT
SELECT CONVERT(decimal(10,5), CONVERT(varbinary(20), @myval))

注意:不要尝试构造 binary
值然后将其转换为数值数据类型类别的一种数据类型。SQL Server 不能保证
decimalnumeric 数据类型到 binary 的转换结果在 SQL Server
的各个版本中都相同。

转换小数位数不同的数据类型时,结果值有时被截断,有时被舍入。下表显示了此行为。

被转换的数据类型 转换到的数据类型 行为

numeric

numeric

舍入

numeric

int

截断

numeric

money

舍入

money

int

舍入

money

numeric

舍入

float

int

截断

float

numeric

舍入

float

datetime

舍入

datetime

int

舍入

例如,以下转换的结果为 10

SELECT CAST(10.6496 AS int)

在进行数据类型转换时,若目标数据类型的小数位数小于源数据类型的小数位数,则该值将被截断。例如,以下转换的结果为
$10.3497

SELECT CAST(10.3496847 AS money)

当非数字型 charncharvarcharnvarchar 数据转换为
intfloatnumericdecimal 时,SQL Server
将返回错误消息。当空字符串 (” “) 转换为 numericdecimal
时,SQL Server 也返回错误。

 

 

备注:文章转载来自官方在线文档。

 

 

备注:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接,否则保留追究责任的权利。

《欢迎交流讨论》

 

xml 样式

如果 data_type 为 xml,则 style
可以为下表中显示的值之一。其他值作为 0 进行处理。

输出

0(默认值)

使用默认的分析行为,即放弃无用的空格,且不允许使用内部 DTD 子集。

注意:

转换为 xml 数据类型时,SQL Server 的无用空格处理方式不同于 XML 1.0。有关详细信息,请参阅生成 XML 实例。

1

保留无用空格。此样式设置将默认的 xml:space 处理方式设置为与指定了 xml:space="preserve" 的行为相同。

2

启用有限的内部 DTD 子集处理。

如果启用,则服务器可使用内部 DTD 子集提供的以下信息来执行非验证分析操作。

应用属性的默认值。

解析并扩展内部实体引用。

检查 DTD 内容模型以实现语法的正确性。

分析器将忽略外部 DTD 子集。此外,不评估 XML 声明来查看 standalone 属性是设置为 yes 还是 no,而是将 XML 实例当成一个独立文档进行分析。

3

保留无用空格,并启用有限的内部 DTD 子集处理。

大值数据类型

大值数据类型表现出与小值数据类型相同的隐式和显式转换行为,特别是
varcharnvarcharvarbinary
数据类型。但是,应该考虑以下原则:

  • imagevarbinary(max)
    的转换与反向转换是隐式转换,text
    varchar(max)ntextnvarchar(max)
    之间的转换也是隐式转换。

  • 从大值数据类型(如 varchar(max))到小值数据类型(如
    varchar)的转换是隐式转换,但如果大值相对于指定长度的小值数据类型显得太大,则产生截断。

  • varcharnvarcharvarbinary
    到其相应的大值数据类型的转换都是隐式执行的。

  • sql_variant 数据类型到大值数据类型的转换是显式转换。

  • 大值数据类型不能转换为 sql_variant 数据类型。

有关如何转换 Microsoft .NET Framework 公共语言运行时 (CLR)
用户定义类型的信息,请参阅对用户定义类型执行操作。有关如何从 xml
数据类型进行转换的详细信息。

文本和图像数据类型

不支持对 textimage 数据类型进行自动数据类型转换。可将
text 数据显式转换为字符数据,将 image 数据转换为 binary
varbinary,但最大长度是 8000
字节。如果试图进行不正确的转换,如将包含字母的字符表达式转换为
int,则 SQL Server 将返回错误消息。

发表评论

电子邮件地址不会被公开。 必填项已用*标注