添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
帅呆的板凳  ·  spring cloud gateway ...·  11 月前    · 
彷徨的山楂  ·  java 向上取整 bigdecimal ...·  1 年前    · 

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 中的 SQL 终结点 Microsoft Fabric 中的仓库

在以下情况下,可以转换数据类型:

  • 当一个对象的数据移到另一个对象,或两个对象之间的数据进行比较或组合时,数据可能必须从一个对象的数据类型转换为另一个对象的数据类型。
  • 将 TransactSQL 结果列、返回代码或输出参数中的数据移到某个程序变量中时,必须将这些数据从 SQL Server 系统数据类型转换成该变量的数据类型。
  • 在应用程序变量与 SQL Server 结果集列、返回代码、参数或参数标记之间进行转换时,支持的数据类型转换由数据库 API 定义。

    隐式和显式转换

    可以隐式或显式转换数据类型。

    隐式转换对用户不可见。 SQL Server 会自动将数据从一种数据类型转换为另一种数据类型。 例如,将 smallint 与 int 进行比较时,在比较之前,smallint 会被隐式转换为 int

    GETDATE() 隐式转换为日期样式 0 。 SYSDATETIME() 隐式转换为日期样式 21

    显式转换使用 CAST 或 CONVERT 函数。

    CAST 和 CONVERT 函数可将值(局部变量、列或其他表达式)从一种数据类型转换为另一种数据类型。 例如,以下 CAST 函数可将数值 $157.27 转换为字符串 '157.27'

    CAST ( $157.27 AS VARCHAR(10) )  
    

    如果希望 Transact-SQL 程序代码符合 ISO 标准,请使用 CAST 而不要使用 CONVERT。 如果要利用 CONVERT 中的样式功能,请使用 CONVERT 而不要使用 CAST。

    以下图例显示了可对 SQL Server 系统提供的数据类型执行的所有显式和隐式数据类型转换。 这些包括 xml、bigint 和sql_variant。 不存在对 sql_variant 数据类型的赋值进行的隐式转换,但是存在转换为 sql_variant 的隐式转换 。

    虽然上面的图表说明了 SQL Server 中允许的所有显式和隐式转换,但并未指出转换的结果数据类型。 当 SQL Server 执行显式转换时,语句本身会确定结果数据类型。 对于隐式转换,赋值语句(例如设置变量的值或在列中插入值)将产生由变量声明或列定义所定义的数据类型。 对于比较运算符或其他表达式,结果数据类型取决于数据类型优先级的规则。

    例如,以下脚本定义一个类型为 varchar 的变量,将 int 类型值赋给该变量,然后选择该变量与字符串的串联。

    DECLARE @string VARCHAR(10);
    SET @string = 1;
    SELECT @string + ' is a string.'
    

    1int 值会转换为 varchar,因此 SELECT 语句返回值 1 is a string.

    下面的示例演示改为使用 int 变量的类似脚本:

    DECLARE @notastring INT;
    SET @notastring = '1';
    SELECT @notastring + ' is not a string.'
    

    在此例中,SELECT 语句会引发以下错误:

    Msg 245, Level 16, State 1, Line 3 Conversion failed when converting the varchar value ' is not a string.' to data type int.

    为了计算表达式 @notastring + ' is not a string.',SQL Server 先遵循数据类型优先级的规则来完成隐式转换,然后才能计算表达式的结果。 由于 int 的优先级高于 varchar,因此 SQL Server 会尝试将字符串转换为整数,但是会失败,因为此字符串无法转换为整数。 如果表达式提供可以转换的字符串,则该语句会成功,如以下示例所示:

    DECLARE @notastring INT;
    SET @notastring = '1';
    SELECT @notastring + '1'
    

    在此例中,字符串 1 可以转换为整数值 1,因而此 SELECT 语句会返回值 2。 请注意,当提供的数据类型为整数时,+ 运算符会成为加法而不是串联。

    数据类型转换行为

    将一个 SQL Server 对象的数据类型转换为另一种数据类型时,不支持某些隐式和显式数据类型转换。 例如,nchar 值无法被转换为 image 值。 nchar 只能显式转换为 binary,而不支持隐式转换为 binary。 但是,nchar 既可以显式也可以隐式转换为 nvarchar

    以下各主题说明各对应数据类型展示的转换行为:

  • binary 和 varbinary (Transact-SQL)
  • datetime2 (Transact-SQL)
  • money 和 smallmoney (Transact-SQL)
  • bit (Transact-SQL)
  • datetimeoffset (Transact-SQL)
  • smalldatetime (Transact-SQL)
  • char 和 varchar (Transact-SQL)
  • decimal 和 numeric (Transact-SQL)
  • sql_variant (Transact-SQL)
  • date (Transact-SQL)
  • float 和 real (Transact-SQL)
  • time (Transact-SQL)
  • datetime (Transact-SQL)
  • int、bigint、smallint 和 tinyint (Transact-SQL)
  • uniqueidentifier (Transact-SQL)
  • 使用 OLE 自动化存储过程转换数据类型

    由于 SQL Server 使用 Transact-SQL 数据类型,而 OLE 自动化使用 Visual Basic 数据类型,因此 OLE 自动化存储过程必须转换在两者之间传递的数据。

    下表说明了从 SQL Server 到 Visual Basic 的数据类型转换。

    SQL Server 数据类型 Visual Basic 数据类型

    除了 binary、varbinary 和 image 值以外,所有单个 SQL Server 值都被转换为单个 Visual Basic 值。 这些值将被转换为 Visual Basic 中的一维 Byte() 数组。 此数组的范围为 Byte( 0 to length 1**)**,其中 length 是 SQL Server binary、varbinary 或 image 值中的字节数。

    以下是从 Visual Basic 数据类型到 SQL Server 数据类型的转换。

    Visual Basic 数据类型 SQL Server 数据类型