当前位置: 首页 > 编程笔记 >

SQL Server数据类型转换方法

颛孙安康
2023-03-14
本文向大家介绍SQL Server数据类型转换方法,包括了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数据类型转换有所帮助。

 类似资料:
  • 问题内容: 从他的问题中很明显,他需要从任何数据类型转换为另一种类型。当我说“数据类型”在这里,我的意思是类型仅限于那些常用来代表原始数据:,,等。对于这个问题,我们可以考虑原语装箱的目的。 我想知道是否有任何API支持类型之间的转换,其中输入和输出都被概括为一组受支持的数据类型。我看了Apache Commons的beanutils.converters包 ,但是每个已知输入都有一个单独的转换器

  • 本文向大家介绍winform dateTime数据类型转换方法,包括了winform dateTime数据类型转换方法的使用技巧和注意事项,需要的朋友参考一下 数据库中保存日期为NULL 程序中查出来判断的时候提示如下: 解决方案: 下面是其它网友的补充: C# winfrom中关於datetime数据类型转换问题,提示无法将字符型转换成datetime 数据库中有个字段date,数据类型是dat

  • JavaScript是一种动态类型语言,变量是没有类型的,可以随时赋予任意值。但是,数据本身和各种运算是有类型的,因此运算时变量需要转换类型。大多数情况下,这种数据类型转换是自动的,但是有时也需要手动强制转换。 强制转换 Number函数:强制转换成数值 String函数:强制转换成字符串 Boolean函数:强制转换成布尔值 自动转换 自动转换为布尔值 自动转换为字符串 自动转换为数值 小结 加

  • 问题内容: 我的数据库是Postgres8。我需要将数据类型转换为另一个。这意味着column数据类型之一是并且需要在语句中将其与Postgres一起转换。 当前,我获取字符串值并将其转换为Java语言。 有什么办法吗?示例代码将不胜感激。 问题答案: cast(varchar_col AS int) – SQL standard 要么 这些语法变体在 任何地方 (几乎)都有效。第二种在特殊情况下

  • 主要内容:1、隐式类型转换,2、显式类型转换数据类型转换就是将一种类型的数据转换为另一种类型,在 C# 中有两种形式的类型转换方式,分别是隐式类型转换和显示类型转换,下面就来详细介绍一下。 1、隐式类型转换 隐式类型转换是由 C# 以类型安全的方式执行的,转换的过程中不会导致数据丢失,例如从较小的整数类型(例如 int)转换到较大的整数类型(例如 long),从派生类转换为基类。 隐式转换不需要我们编写额外的代码,下例中演示了如何使用隐式类

  • 虽然 Python 是弱类型编程语言,不需要像 Java 或 C 语言那样还要在使用变量前声明变量的类型,但在一些特定场景中,仍然需要用到类型转换。 比如说,我们想通过使用 print() 函数输出信息“您的身高:”以及浮点类型 height 的值,如果在交互式解释器中执行如下代码: >>> height = 70.0 >>> print("您的身高"+height) Traceback (mos