显式数据类型转换函数

在 SQL 数据类型定义中指定显式数据类型转换。

显式数据类型转换函数的 ODBC 语法不会限制转换。 一种数据类型到另一数据类型的特定转换的有效性将由每个特定于驱动程序的实现确定。 驱动程序将随着 ODBC 语法转换为本机语法而拒绝这些转换,尽管 ODBC 语法是合法的,但数据源不支持这些转换。 ODBC 函数 SQLGetInfo 具有转换选项(例如SQL_CONVERT_BIGINT、SQL_CONVERT_BINARY、SQL_CONVERT_INTERVAL_YEAR_MONTH等),提供了一种方法来查询数据源支持的转换。

CONVERT 函数的格式为:

CONVERT(value_expdata_type

该函数返回由转换为指定data_type value_exp指定的值,其中data_type是以下关键字之一:

SQL_BIGINT
SQL_BINARY
SQL_BIT
SQL_CHAR
SQL_DATE
SQL_DECIMAL
SQL_DOUBLE
SQL_FLOAT
SQL_GUID
SQL_INTEGER
SQL_INTERVAL_DAY
SQL_INTERVAL_DAY_TO_HOUR

SQL_INTERVAL_DAY_TO_MINUTE
SQL_INTERVAL_DAY_TO_SECOND
SQL_INTERVAL_HOUR
SQL_INTERVAL_HOUR_TO_MINUTE
SQL_INTERVAL_HOUR_TO_SECOND
SQL_INTERVAL_MINUTE
SQL_INTERVAL_MINUTE_TO_SECOND
SQL_INTERVAL_MONTH
SQL_INTERVAL_SECOND
SQL_INTERVAL_YEAR
SQL_INTERVAL_YEAR_TO_MONTH
SQL_LONGVARBINARY

SQL_LONGVARCHAR
SQL_NUMERIC
SQL_REAL
SQL_SMALLINT
SQL_TIME
SQL_TIMESTAMP
SQL_TINYINT
SQL_VARBINARY
SQL_VARCHAR
SQL_WCHAR
SQL_WLONGVARCHAR
SQL_WVARCHAR

显式数据类型转换函数的 ODBC 语法不支持转换格式规范。 如果基础数据源支持显式格式的规范,驱动程序必须指定默认值或实现格式规范。

参数value_exp可以是列名、另一个标量函数的结果,也可以是数值或字符串文本。 例如:

{ fn CONVERT( { fn CURDATE() }, SQL_CHAR ) }  

将 CURDATE 标量函数的输出转换为字符串。

由于 ODBC 不强制从标量函数返回值的数据类型(因为函数通常是特定于数据源),因此应用程序应尽可能使用 CONVERT 标量函数强制转换数据类型。

以下两个示例说明了 CONVERT 函数的使用。 这些示例假定存在名为 EMPLOYEES 的表,其类型为 SQL_SMALLINT 的 EMPNO 列和类型为 SQL_CHAR 的 EMPNAME 列。

如果应用程序指定以下 SQL 语句:

SELECT EMPNO FROM EMPLOYEES WHERE {fn CONVERT(EMPNO,SQL_CHAR)} LIKE '1%'  
  • ORACLE 驱动程序将 SQL 语句转换为:

    SELECT EMPNO FROM EMPLOYEES WHERE to_char(EMPNO) LIKE '1%'  
    
  • SQL Server 驱动程序将 SQL 语句转换为:

    SELECT EMPNO FROM EMPLOYEES WHERE convert(char,EMPNO) LIKE '1%'  
    

如果应用程序指定以下 SQL 语句:

SELECT {fn ABS(EMPNO)}, {fn CONVERT(EMPNAME,SQL_SMALLINT)}  
   FROM EMPLOYEES WHERE EMPNO <> 0  
  • ORACLE 驱动程序将 SQL 语句转换为:

    SELECT abs(EMPNO), to_number(EMPNAME) FROM EMPLOYEES WHERE EMPNO <> 0  
    
  • SQL Server 驱动程序将 SQL 语句转换为:

    SELECT abs(EMPNO), convert(smallint, EMPNAME) FROM EMPLOYEES  
       WHERE EMPNO <> 0  
    
  • Ingres 的驱动程序将 SQL 语句转换为:

    SELECT abs(EMPNO), int2(EMPNAME) FROM EMPLOYEES WHERE EMPNO <> 0