</nav><p><strong>适用于:</strong> <img src="https://docs.microsoft.com/zh-CN/sql/includes/media/yes-icon.svg?view=azuresqldb-mi-current" role="presentation" data-linktype="relative-path">SQL Server <img src="https://docs.microsoft.com/zh-CN/sql/includes/media/yes-icon.svg?view=azuresqldb-mi-current" role="presentation" data-linktype="relative-path">Azure SQL 数据库 <img src="https://docs.microsoft.com/zh-CN/sql/includes/media/yes-icon.svg?view=azuresqldb-mi-current" role="presentation" data-linktype="relative-path">Azure SQL 托管实例 <img src="https://docs.microsoft.com/zh-CN/sql/includes/media/yes-icon.svg?view=azuresqldb-mi-current" role="presentation" data-linktype="relative-path">Azure Synapse Analytics <img src="https://docs.microsoft.com/zh-CN/sql/includes/media/yes-icon.svg?view=azuresqldb-mi-current" role="presentation" data-linktype="relative-path">分析平台系统 (PDW) <img src="https://docs.microsoft.com/zh-CN/sql/includes/media/yes-icon.svg?view=azuresqldb-mi-current" role="presentation" data-linktype="relative-path">Microsoft Fabric 中的 SQL 分析端点 <img src="https://docs.microsoft.com/zh-CN/sql/includes/media/yes-icon.svg?view=azuresqldb-mi-current" role="presentation" data-linktype="relative-path">Microsoft Fabric 中的仓库</p>
讯享网
这些函数将表达式由一种数据类型转换为另一种数据类型。
语法:
讯享网
语法:
Transact-SQL 语法约定
讯享网
expression
任何有效的表达式。
data_type
目标数据类型。 这包括 xml、bigint 和sql_variant 。 不能使用别名数据类型。
length
指定目标数据类型长度的可选整数,适用于允许用户指定长度的数据类型。 默认值为 30。
style
指定 函数将如何转换表达式的整数表达式。 对于 NULL 的样式值,则返回 NULL。 data_type 确定范围。
返回转换为 data_type 的 expression 。
对于日期或时间数据类型的 expression,style 可以具有下表所示的某个值。 其他值作为 0 进行处理。 从 SQL Server 2012 (11.x) 开始,在从日期和时间类型转换为 datetimeoffset 时支持的唯一样式是 0 或 1。 所有其他转换样式均返回错误 9809。
101 =
2 102 ANSI 2 =
102 =
3 103 英国/法国 3 =
103 =
4 104 德语 4 =
104 =
5 105 意大利语 5 =
105 =
6 106 1 - 6 =
106 =
7 107 1 - 7 =
107 =
8 或 24 108 - - 9 或 109 1、 2 默认格式 + 毫秒 (或 ) 10 110 USA 10 = mm-dd-yy
110 =
11 111 日本 11 = yy/mm/dd
111 =
12 112 ISO 12 = yymmdd
112 =
- 13 或 113 1、2 欧洲默认格式 + 毫秒 (24 小时制) 14 114 - (24 小时制) - 20 或 120 2 ODBC 规范 (24 小时制) - 21 或 25 或 121 2 time、date、datetime2 和 datetimeoffset 的 ODBC 规范(用毫秒表示)默认值 (24 小时制) 22 - 美国 (或 ) - 23 ISO8601 - 126 4 ISO8601 (无空格) 6 - 127 8, 9 包括时区 Z 的 ISO8601 (无空格) 6 - 130 1, 2 回历 5 7 - 131 2 回历 5
1 这些样式值返回不确定的结果。 包括所有 ()(不带世纪数位)样式和一部分 ()(带世纪数位)样式。
2默认值(0 或 100、9 或 109、13 或 113、20 或 120、23,以及 21 或 25 或 121)始终返回世纪位数 ()。
3 转换为 datetime 时输入;转换为字符数据时输出。
4 为用于 XML 而设计。 对于从 datetime 或 smalldatetime 到字符数据的转换,请参阅上一个表,查看输出格式 。
5 回历是有多种变体的日历系统。 SQL Server 使用科威特算法。
6 毫秒 () 值为 0 时,不会显示毫秒小数部分的值。 例如,值 显示为 。
7 在此样式中, 表示完整月份名称的多标记回历 unicode 表示形式。 该值在 SSMS 的默认 US 安装中不会正确呈现。
8 仅在从字符数据强制转换到 datetime 或 smalldatetime 时提供支持。 仅表示日期或时间成分的字符数据强制转换为 datetime 或 smalldatetime 数据类型时,未指定的时间成分设置为 ,未指定的日期成分设置为 。
9 使用可选的时区指示符 ,可更容易地将具有时区信息的 XML datetime 值映射到没有时区的 SQL Server datetime 值。 指示时区 UTC-0。 或 方向的 偏移量则指示其他时区。 例如:。
将 smalldatetime 转换为字符数据时,包含秒或毫秒的样式将在这些位置上显示零。 从 datetime 或 smalldatetime 值转换时,可以使用合适的 char 或 varchar 数据类型长度截断不需要的日期部分 。
使用包含时间的样式将字符数据转换为 datetimeoffset 时,将在结果末尾追加时区偏移量。
对于 float 或 real 表达式,style 可能具有下表显示的值之一。 其他值作为 0 进行处理。
适用于:SQL Server 2016 (13.x) 及更高版本和 Azure SQL 数据库。
126, 128, 129 出于传统原因包括在内。 请勿将这些值用于新的开发过程。
对于 money 和 smallmoney 表达式,style 可能具有下表显示的值之一。 其他值作为 0 进行处理。
示例:4235.98。
1 小数点左侧每三位数字之间以逗号分隔,小数点右侧取两位数
示例:3,510.92。
2 小数点左侧每三位数字之间不以逗号分隔,小数点右侧取四位数
示例:4235.9819。
126 转换为 char(n) 或 varchar(n) 时,等同于样式 2
对于 xml 表达式,style 可能具有下表显示的值之一。 其他值作为 0 进行处理。
注意: 转换为 xml 数据类型时,SQL Server 的无用空格处理方式不同于 XML 1.0。 有关详细信息,请参阅创建 XML 数据的实例。
1 保留无用空格。 此样式设置将默认 处理设置为匹配 的行为。 2 启用有限的内部 DTD 子集处理。
如果启用,则服务器可使用内部 DTD 子集提供的以下信息来执行非验证分析操作。
- 应用属性的默认值
- 解析并展开内部实体引用
- 检查 DTD 内容模型来确定语法的正确性
分析器忽略外部 DTD 子集。 此外,它不会评估 XML 声明来查看 standalone 属性具有 yes 值还是 no 值。 相反,它将 XML 实例解析为独立文档。
3 保留无用空格,并启用有限的内部 DTD 子集处理。
对于 binary(n)、char(n)、varbinary(n)或 varchar(n) 表达式,样式可以具有下表中显示的值之一。 表中没有列出样式值将返回错误。
对于二进制 data_type,则会在结果左侧添加字符 0x。
1, 2 对于二进制 data_type,则表达式必须为字符表达式。 expression 必须具有偶数数量的十六进制数字(0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、a、b、c、d、e、f)。 如果将 style 设置为 1,则表达式必须将 0x 作为前两个字符。 如果表达式中包含的字符数为奇数或者包含任何无效的字符,则会引发错误。
如果转换后的表达式长度大于 data_type 长度,则会在右侧截断结果。
如果固定长度 data_types 大于转换后的结果,则在结果右侧添加零。
字符类型的 data_type 要求二进制表达式。 每个二进制字符均转换为两个十六进制字符。 假设转换后的表达式长度大于 data_type 长度。 在这种情况下,它会被截断。
对于固定大小的字符类型 data_type ,并且转换后的结果长度小于其 data_type 长度,则会在转换后的表达式右侧添加空格,以使十六进制数字的个数保持为偶数 。
对于样式 2,不会在转换后的结果左侧添加字符 0x。
隐式转换不需要规范 函数或 函数。 显示转换需要规范 函数或 函数。 以下图例显示了可对 SQL Server 系统提供的数据类型执行的所有显式和隐式数据类型转换。 这些包括 bigint、sql_variant 和 xml 。 不存在对 sql_variant 数据类型的赋值进行的隐式转换,但是存在转换为 sql_variant 的隐式转换 。
虽然上面的图表说明了 SQL Server 中允许的所有显式和隐式转换,但转换生成的数据类型取决于执行的操作:
- 对于显式转换,语句本身会确定生成的数据类型。
- 对于隐式转换,赋值语句(例如设置变量的值或在列中插入值)将生成由变量声明或列定义所定义的数据类型。
- 对于比较运算符或其他表达式,生成的数据类型取决于数据类型优先级的规则。
在 datetimeoffset 与字符类型 char、nchar、nvarchar 和 varchar 之间转换时,转换后的时区偏移量部分的 和 都应始终为两个数字。 例如 。
因为 Unicode 数据始终使用偶数个字节,所以在 binary 或 varbinary 与支持 Unicode 的数据类型之间进行转换时要特别小心 。 例如,以下转换不返回十六进制值 41。 而是返回十六进制值 4100:
讯享网
有关详细信息,请参阅 排序规则和 Unicode 支持。
大值数据类型具有与小值数据类型相同的隐式和显式转换行为 - 特别是 nvarchar、varbinary 和 varchar 数据类型 。 但是,请考虑以下原则:
- 从 image 转换到 varbinary(max) 以及从 varbinary(max) 转换到 image 属于隐式转换操作,同样的还有 text 与 varchar(max) 之间的转换和 ntext 与 nvarchar(max) 之间的转换 。
- 从大值数据类型(如 varchar(max))到小值数据类型(如 varchar)的转换是隐式转换,但如果大值的大小超过小值数据类型的指定长度,则产生截断 。
- 从 nvarchar、varbinary 或 varchar 到其相应的大值数据类型的转换都是隐式转换 。
- 从 sql_variant 数据类型到大值数据类型的转换是显式转换。
- 大值数据类型不能转换为 sql_variant 数据类型。
有关从 xml 数据类型进行转换的详细信息,请参阅创建 XML 数据的实例。
将 xml 数据类型显式或隐式转换为字符串或二进制数据类型时,xml 数据类型的内容将根据一组确定的规则进行序列化 。 有关这些规则的信息,请参阅定义 XML 数据的序列化。 有关从其他数据类型转换到 xml 数据类型对的信息,请参阅创建 XML 数据的实例。
text 和 image 数据类型不支持自动进行数据类型转换。 可以显式将 text 数据转换为字符数据,将 image 数据转换为 binary 或 varbinary,但是最大长度为 8000 字节 。 如果试图进行不正确的转换(如将包含字母的字符表达式转换为 int),则 SQL Server 将返回错误消息。
如果 或 函数输出字符串,并且接收字符串输入,则输出将与输入具有相同的排序规则和排序规则标签。 如果输入不是字符串,则输出采用数据库的默认排序规则以及强制默认的排序规则标签。 有关详细信息,请参阅 排序规则优先顺序 (Transact-SQL)。
若要为输出分配不同的排序规则,请将 COLLATE 子句应用于 或 函数的结果表达式。 例如:
将字符或二进制表达式(binary、char、nchar、nvarchar、varbinary 或 varchar)转换为不同数据类型的表达式时,转换操作可能会截断输出数据,仅显示部分输出数据,或返回错误 。 如果结果太短而无法显示,则会发生这种情况。 会截断到 binary、char、nchar、nvarchar、varbinary 或 varchar 的转换,除了下表中显示的转换 。
varchar
长度太短而无法显示 nchar
nvarchar
错误 1 money、smallmoney、numeric、decimal、float 或 real char
varchar
错误 1 nchar
nvarchar
错误 1
1 因为结果长度太短无法显示而返回错误。
SQL Server 仅保证往返转换(也就是从原始数据类型进行转换后又返回原始数据类型的转换)在各版本间产生相同值。 以下示例显示的即是这样的往返转换:
讯享网
以下示例显示了由于太小而无法显示的结果表达式。
结果集如下。
讯享网
转换小数位数不同的数据类型时,SQL Server 有时会返回截断后的结果值,有时会返回舍入值。 此表显示了此行为。
1 如果将使用科学记数法的 float 值转换为 decimal 或 numeric 时,转换会限制为只有 17 位精度的值。 精度高于 17 的任何值都将舍入为零。
例如,10.6496 和 -10.6496 可能会被截断或者在转换到 int 或 numeric 类型期间被舍入 :
查询结果显示在下表中:
在进行数据类型转换时,若目标数据类型的小数位数小于源数据类型的小数位数,则该值将进行舍入。 例如,此转换返回 :
讯享网
将非数字 char、nchar、nvarchar 或 varchar 数据转换为 decimal、float、int、numeric 时,SQL Server 返回错误消息 。 当空字符串 (" ") 转换为 numeric 或 decimal 时,SQL Server 也返回错误 。
从 string 到 datetime 的转换为不确定性转换的样式如下所示:
- 低于 100 的所有样式 1
- 106
- 107
- 109
- 113
- 130
1 样式 20 和 21 除外
有关详细信息,请参阅文字日期字符串转换为日期值的不确定性转换。
从 SQL Server 2012 (11.x) 开始,使用增补字符 (SC) 排序规则时,从 nchar 或 nvarchar 到更小长度的 nchar 或 nvarchar 类型的 操作将不会在代理项对内截断。 相反,该操作会在增补字符前面截断。 例如,以下代码段导致 仅保留 。 没有足够的空间来保留增补字符。
在使用 SC 排序规则时, 行为类似于 。 有关详细信息,请参阅排序规则和 Unicode 支持 - 补充字符。
在 SQL Server 的早期版本中,对 time 或 datetime2 数据类型的 和 操作的默认样式为 121,当在计算列表达式中使用这些类型时除外。 对于计算列,默认样式为 0。 当创建用于涉及自动参数化的查询中或约束定义中的计算列时,此行为会影响计算列。
兼容性级别为 110 或更高时,对 time 和 datetime2 数据类型的 和 操作的默认样式始终为 121。 如果查询依赖旧行为,请使用低于 110 的兼容性级别或在受影响的查询中显式指定 0 样式。
1 计算列除外

将数据库升级到兼容级别 110 或更高将不更改已存储到磁盘的用户数据。 您必须相应手动更正此数据。 例如,如果使用了 SELECT INTO 来从包含上述计算列表达式的源创建表,将存储数据(使用样式 0)而非存储计算列定义本身。 必须手动更新此数据,以匹配样式 121。
每个示例检索标价的第一位是 的产品的名称,并将其 值转换为 int。
使用 :
讯享网
使用 :
结果集如下。 和 的示例结果集相同。
讯享网
此示例将本年度截止到现在的全部销售额 () 除以佣金百分比 (),从而得出单列计算结果 ()。 此值舍入为最接近的整数,然后 为 int 数据类型。
结果集如下。
讯享网
此示例使用 连接非字符型表达式。 它使用 数据库。
结果集如下。
讯享网
此示例使用 SELECT 列表中的 将 列转换为 char(10) 列。 它使用 数据库。
结果集如下。
讯享网
此示例将 列 值转换为数据类型 int,然后转换为数据类型 char(20),以便 子句可以使用。
结果集如下。
讯享网
这些示例说明如何通过 XML 数据类型和列 (SQL Server) 使用 将数据转换为类型化的 XML。
此示例将包含空格、文本和标记的字符串转换为类型化的 XML,并删除所有无用空格(节点之间的边界空格):
此示例将包含空格、文本和标记的类似字符串转换为类型化的 XML,并保留无用空格(节点之间的边界空格):
讯享网
此示例将包含空格、文本和标记的字符串转换为类型化的 XML:
有关更多示例,请参阅创建 XML 数据的实例。
从 值开始,此示例显示当前日期和时间,使用 将当前日期和时间更改为字符数据类型,然后使用 以 格式显示日期和时间。
讯享网
结果集如下。
此示例与上述示例几乎完全相反。 该示例将日期和时间显示为字符数据,使用 将字符数据更改为 datetime 数据类型,然后使用 将字符数据更改为 datetime 数据类型。
讯享网
结果集如下。
这些示例使用不同样式显示二进制和字符数据转换的结果。
讯享网
结果集如下。
此示例显示 Style 1 可以强制截断结果。 结果集中的字符 0x 强制实施截断。
讯享网
结果集如下。
该例显示样式 2 不截断结果,因为结果中不包括字符 0x。
讯享网
结果集如下。
将字符值“Name”转换为二进制值。
讯享网
结果集如下。
讯享网
结果集如下。
讯享网
结果集如下。
此示例显示了 date、time 及 datetime 数据类型的转换。
讯享网
考虑从 date 转换到 datetime 或 datetime2 时,请确保这些值在兼容的范围内。 datetime 的最小年份值为 ,而 date 和 datetime2 的最小年份值为 。
从 值开始,此示例使用 显示本文日期和时间样式部分的所有日期和时间样式。
以下示例定义一个类型为 varchar(10) 的变量,将整数值赋给该变量,然后选择该变量与字符串的串联。
讯享网
结果集如下。
int 值 1 已转换为 varchar。
此示例显示了一个类似的查询,但它使用的是 int 变量:
讯享网
在此例中,SELECT 语句会引发以下错误:
为了计算表达式 ,SQL Server 需要先遵循数据类型优先级的规则来完成隐式转换,然后才能计算表达式的结果。 由于 int 的优先级高于 varchar,SQL Server 会尝试将字符串转换为整数,但是会失败,因为此字符串无法转换为整数。
如果我们提供可转换的字符串,则该语句将成功,如以下示例中所示:
讯享网
在此例中,字符串 可以转换为整数值 1,因而此 SELECT 语句会返回值 2。 当提供的数据类型为整数时,+ 运算符会成为加法运算符而不是字符串串联。
此示例检索标价的第一位是 的产品的名称,并将这些产品的 转换为 int。它使用 数据库。
此示例显示使用 而不是 的相同查询。 它使用 数据库。
讯享网
此例通过产品单价 () 除以折扣率 () 计算单列值。 然后,此结果会舍入到最接近的整数,并最终转换为 int 数据类型。 此示例使用 数据库。
结果集如下。
讯享网
此例将 money 列 转换为 int 类型,然后转换为 char(20) 类型,以便 LIKE 子句可以使用它 。 此示例使用 数据库。
此示例显示当前日期和时间,使用 将当前日期和时间更改为字符数据类型,最终使用 以 ISO 8601 格式显示日期和时间。 此示例使用 数据库。
讯享网
结果集如下。
此示例与上述示例大致相反。 该示例将日期和时间显示为字符数据,使用 将字符数据更改为 datetime 数据类型,然后使用 将字符数据更改为 datetime 数据类型。 此示例使用 数据库。
讯享网
结果集如下。
- FORMAT (Transact-SQL)
- STR (Transact-SQL)
- SELECT (Transact-SQL)
- 系统函数 (Transact-SQL)
- 排序规则和 Unicode 支持
- 数据类型优先级 (Transact-SQL)
- 数据类型转换(数据库引擎)
- 编写国际化 Transact-SQL 语句
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/199421.html