SQL Server数据类型转换方法

在SQL Server日常的函数、存储过程和SQL语句中,经常会用到不同数据类型的转换。在SQL Server有两种数据转换类型:一种是显性数据转换;另一种是隐性数据转换。下面分别对这两种数据类型转换进行简要的说明:

1 显式转换

显示转换是将某种数据类型的表达式显式转换为另一种数据类型。常用的是CAST 和 CONVERT 函数。

CAST: CAST ( expression AS data_type )
 CONVERT: CONVERT (data_type[(length)], expression [, style])

参数 expression 是任何有效的 Microsoft SQL Server表达式。data_type 目标系统所提供的数据类型,不能使用用户定义的数据类型。

2 隐性转换

隐性转换对于用户是不可见的,由SQL Server 引擎自动处理。 隐性转换自动将数据从一种数据类型转换成另一种数据类型。例如,如果一个 smallint 变量和一个 int 变量相比较,这个 smallint 变量在比较前即被隐性转换成 int 变量。 当从一个 SQL Server 对象的数据类型向另一个转换时,一些隐性和显式数据类型转换是不支持的。例如,nchar 数值根本就不能被转换成 image 数值。nchar 只能显式地转换成 binary,隐性地转换到 binary 是不支持的。nchar 可以显式地或者隐性地转换成 nvarchar。

3 隐性转换的风险

隐性转换有的时候非常方便,可以简化SQL 脚本,但是这里面也孕育着潜在的风险,可能会出现在脚本一开始运行的时候都是正常的,但却某一个时间点之后,程序莫名出现错误。下面举一个现实项目中的例子来说明。在SQL Server 2008中有一个表,需要从两个不同的数据表中拉取数据,由于这两个数据表属于不同的系统,其主键类型是不同的,一个是int类型,一个是GUID,一开始想着这两个都可以转换成字符类型进行存储。所以就在表中建立一个nvarchar(50)的混合ID列作为主键。如下图所示:

一开始拉取的数据并未有GUID的值,都是INT类型转换过来的数据,所以SQL脚本运行的正常,但是突然某一次运行时,出现了“在将 nvarchar 值 '4C185367-F004-41FE-8A0A-DB4E819B1FF2' 转换成数据类型 int 时失败。”的错误。如下图所示:

定位到脚本,执行的SQL如下:

select * from dbo.Demo where 混合ID=305

其中主键中的数据有GUID转换的字符型,也有INT转换的字符串,示例数据如下:

但是如果执行下面的SQL,则都是正常执行:

select * from dbo.Demo where 混合ID=305 and 名称='INT' select * from dbo.Demo where 混合ID=305 and 序号='2' select * from dbo.Demo where 混合ID=305 and 序号=2 select * from dbo.Demo where 混合ID='305' and 名称='INT' select * from dbo.Demo where 混合ID='305'

结果如下:

出现上述错误的结果应该是这样的:

select * from dbo.Demo where 混合ID=305在执行时,SQL Server会将nvarchar类型的隐性转换成int类型,如果数据中没有GUID类型的字符,则转换正常,如果有,当进行GUID字符到INT的隐性转换时,则转换失败。

以上就是本文的全部内容,希望对大家进行SQL Server数据类型转换有所帮助。

时间: 2024-09-23 10:05:07

SQL Server数据类型转换方法的相关文章

SQL Server数据类型转换方法_MsSql

在SQL Server日常的函数.存储过程和SQL语句中,经常会用到不同数据类型的转换.在SQL Server有两种数据转换类型:一种是显性数据转换:另一种是隐性数据转换.下面分别对这两种数据类型转换进行简要的说明: 1 显式转换 显示转换是将某种数据类型的表达式显式转换为另一种数据类型.常用的是CAST 和 CONVERT 函数.  CAST: CAST ( expression AS data_type )  CONVERT: CONVERT (data_type[(length)], ex

Oracle与SQL Server数据类型对应关系

SQL Server 数据类型 Oracle 数据类型 bigint NUMBER binary LONG RAW NOT NULL bit NUMBER (1, 0) char VARCHAR2 (900) NOT NULL datetime DATE decimal NUMBER (255, 3) NOT NULL float FLOAT NOT NULL image LONG RAW int NUMBER (255, 3) NOT NULL money NUMBER (255, 3) NO

SQL Server数据类型int、bigint、smallint和tinyint范围

环境:SQLServer 2008 R2 使用整数数据的精确数字数据类型. bigint 从 -2^63 (-9223372036854775808) 到 2^63-1(9223372036854775807) 的整型数据(所有 数字).存储大小为 8 个字节. int 从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字).存储大小为 4 个字节.int 的 SQL-92 同义字为 integer. smallint 从

SQL Server数据类型char、nchar、varchar、nvarchar的区别浅析

在SQL Server中,当我们设置字符型字段的时候,往往有很多个数据类型供我们选择,如:char nchar varchar nvarchar等,那么我们到底应该选择哪一个呢?下面就一一来描述其区别. char:固定长度,非Unicode字符数据,长度为n个字节.n的取值范围为1至8,000,存储大小是n个字节.char的SQL2003同义词为character. varchar:可变长度,非Unicode字符数据.n的取值范围为1至8,000.max指示最大存储大小是2^31-1个字节.存储

SQL Server数据类型char、nchar、varchar、nvarchar的区别浅析_MsSql

在SQL Server中,当我们设置字符型字段的时候,往往有很多个数据类型供我们选择,如:char nchar varchar nvarchar等,那么我们到底应该选择哪一个呢?下面就一一来描述其区别. char:固定长度,非Unicode字符数据,长度为n个字节.n的取值范围为1至8,000,存储大小是n个字节.char的SQL2003同义词为character. varchar:可变长度,非Unicode字符数据.n的取值范围为1至8,000.max指示最大存储大小是2^31-1个字节.存储

SQL SERVER 数据类型详解补充2

数据类型 类型 描 述 bit 整型 bit 数据类型是整型,其值只能是0.1或空值.这种数据类型用于存储只有两种可能值的数据,如Yes 或No.True 或Fa lse .On 或Off int 整型 int 数据类型可以存储从- 231(-2147483648)到231 (2147483 647)之间的整数.存储到数据库的几乎所有数值型的数据都可以用这种数据类型.这种数据类型在数据库里占用4个字节 smallint 整型 smallint 数据类型可以存储从- 215(-32768)到215

SQL SERVER 数据类型详解

server|数据|数据类型|详解 数据类型 类型 描             述 bit 整型 bit 数据类型是整型,其值只能是0.1或空值.这种数据类型用于存储只有两种可能值的数据,如Yes 或No.True 或Fa lse .On 或Off int 整型 int 数据类型可以存储从- 231(-2147483648)到231 (2147483 647)之间的整数.存储到数据库的几乎所有数值型的数据都可以用这种数据类型.这种数据类型在数据库里占用4个字节 smallint 整型 small

SQL SERVER 数据类型详解补充2_MsSql

数据类型 类型 描 述 bit 整型 bit 数据类型是整型,其值只能是0.1或空值.这种数据类型用于存储只有两种可能值的数据,如Yes 或No.True 或Fa lse .On 或Off int 整型 int 数据类型可以存储从- 231(-2147483648)到231 (2147483 647)之间的整数.存储到数据库的几乎所有数值型的数据都可以用这种数据类型.这种数据类型在数据库里占用4个字节 smallint 整型 smallint 数据类型可以存储从- 215(-32768)到215

RDS SQL Server - 专题分享 - 巧用执行计划缓存之数据类型隐式转换

摘要 SQL Server数据库基表数据类型隐式转换,会导致Index Scan或者Clustered Index Scan的问题,这篇文章分享如何巧用执行计划缓存来发现数据类型隐式转换的查询语句,从而可以有针对性的优化查询,解决高CPU使用率的问题. 问题引入 测试环境 为了更好的展示从执行计划缓存缓存中找出导致数据类型转化的查询语句,我们先建立测试环境. -- Create testing database IF DB_ID('TestDb') IS NULL CREATE DATABASE