`
jiagyao
  • 浏览: 99215 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

SQL Server2005学习笔记3之--关于LOB和数据的隐式转化

阅读更多
1.关于LOB(Large Object)
2005后SQL 引进了新的MAX说明符来支持LOB。虽然这个版本的TEXT,NTEXT,IMAGE继续被支持着,因为前者的出现而不再推荐使用。
它还引入了XML数据类型,允许你存储和处理XML数据。还允许使用BULK引擎高效地将文件数据加载为行集。
MAX:
通过MAX说明符,存储的值可以高达2GB 这是目前为止最大量的数据类型。
2005中统一了常规数据类型和LOB类型的编程模型,所有支持常规类型的函数现在也支持由MAX说明符定义的数据类型。
这里提一点 :如果你想修改这类型数据的一部分值的时候 如果采用STUFF这样的函数将重新加载整个字符串,这样对大型的数据效率是个问题。这个时候你可以尝试对MAX列制作的函数 WRITE方法。
UPDATE dbo.CustomerData
  SET txt_data.WRITE('one hundred and two', 9, 3)
WHERE custid = 102;
--'one hundred and two' 是替换的目标值,9是替换的起始位置(从0开始,9就是第十个),3替换长度
WRITE(A,B,C)
1.A为NULL 从B位置开始的字符串截断
2.B为NULL && C==0 把A直接添加到字符串的末尾
3.C为NULL B之后的字符串截断,然后将A添加到字符串末尾
另外:如果数据对象为NULL,write方法更新失效
BULK:
--建表
IF OBJECT_ID('dbo.Shippers') IS NOT NULL
  DROP TABLE dbo.Shippers;
GO
CREATE TABLE dbo.Shippers
(
  ShipperID   INT          NOT NULL PRIMARY KEY,
  CompanyName NVARCHAR(40) NOT NULL,
  Phone       NVARCHAR(24) NOT NULL CHECK(Phone NOT LIKE '%[^0-9() ]%')
);
GO
--利用OPENROWSET函数返回值作为表
INSERT INTO dbo.Shippers WITH (IGNORE_CONSTRAINTS)--目标表(IGNORE_CONSTRAINTS 插入时候无视约束)
  SELECT ShipperID, CompanyName, Phone
    FROM OPENROWSET(BULK 'c:\temp\shippers.txt',
           FORMATFILE = 'c:\temp\shippers.fmt') AS S;
--这里关于BULK的数据转移不再多说 内容很多 日后整理出大量数据迁移的三种基本方法 BCP, INSERT BULK, OPENROWSET(BULK...) 后续学习后整理。

2.隐式转化
大家都知道当2个不同数据类型的数据进行计算的时候 首先低优先级向高优先级转化,然后计算
附上数据类型优先级表:

用户定义数据类型(最高)
sql_variant
xml
datetime
smalldatetime
float
real
decimal
money
smallmoney
bigint
int
smallint
tinyint
bit
ntext
text
image
timestamp
uniqueidentifier
nvarchar(包括 nvarchar(max))
nchar
varchar (包括 varchar(max))
char
varbinary(包括 varbinary(max))
binary(最低)
这就是为什么1+'1' =2 ,1. *col 结果为DECIMAL类型了
下面说个由自动转换引发的问题:
SELECT
  CASE
    WHEN 1 > 1 THEN 10
    WHEN 1 = 1 THEN 'abc'
    WHEN 1 < 1 THEN 10.
  END;
-----错误:消息 8114,级别 16,状态 5,第 1 行
从数据类型 varchar 转换为 numeric 时出错。
-----------------------------------------------
为什么会错呢?从错误可以看出 本来预想的结果为‘abc’ 然后我们看'abc' 10 10. 数据类型分别为varchar,int,numeric 优先级最高为
numeric ,所以结果也应该是numeric ‘abc’无法转成NUMERIC 所以。。。。
解决方法有2个:
1.将结果表达式都转化成通用的数据类型,比如varchar(100),但是这样做的可能会出现比较,排序的时候的问题
2.将结果表达式都转化成SQL_VARIANT
SELECT
  CASE
    WHEN 1 > 1 THEN CAST(10 AS SQL_VARIANT)
    WHEN 1 = 1 THEN CAST('abc' AS SQL_VARIANT)
    WHEN 1 < 1 THEN CAST(10. AS SQL_VARIANT)
  END;
比较具有不同基本数据类型的 sql_variant 值,而且基本数据类型属于不同的数据类型系列时,认为在层次结构图中数据类型系列较高的值为两值中的较大值。
比较具有不同基本数据类型的 sql_variant 值,而且基本数据类型属于相同的数据类型系列时,层次结构图中基本数据类型较低的值先隐式转换成其他数据类型,然后再进行比较。
关于SQL_VARIANT 参考http://msdn.microsoft.com/zh-cn/library/ms181071.aspx
筛选表达式也存在隐式转化:
a.表达式2边数据类型相同时候,如果存在索引,就会考虑使用索引,当然使用函数后就不再是SARG了
b.表达式2边数据类型不相同的时候,不相同版本处理方法是不一样的。
2000中col=标量表达式 如果标量表达式优先级大于col列的数据类型 列就转换成标量表达式的类型 无法再使用SARG;如果是2个表的列COL1=COL2.COL1 COL2数据类型系列即使一样,优化器也不会认为2列的索引具有相同的排序行为,除非低优先级的一侧在转化数据类型后使用SORT运算显示排序。
2005更加方法 只要知道2列属于同一个数据类型系列(注意,不是数据类型 是数据类型系列 这个可以去百度下),索引就具有相同的排序行为,所以可以使用索引了。
测试代码,查看执行计划即可以发现
SET NOCOUNT ON;
USE tempdb;
GO
IF OBJECT_ID('dbo.T1') IS NOT NULL
  DROP TABLE dbo.T1;
IF OBJECT_ID('dbo.T2') IS NOT NULL
  DROP TABLE dbo.T2;
GO
CREATE TABLE dbo.T1(col1 INT PRIMARY KEY);
CREATE TABLE dbo.T2(col1 NUMERIC(12, 2) PRIMARY KEY);
INSERT INTO dbo.T1(col1) VALUES(1);
INSERT INTO dbo.T1(col1) VALUES(2);
INSERT INTO dbo.T1(col1) VALUES(3);
INSERT INTO dbo.T2(col1) VALUES(1.);
INSERT INTO dbo.T2(col1) VALUES(2.);
INSERT INTO dbo.T2(col1) VALUES(3.);
SELECT T1.col1, T2.col1
FROM T1 INNER MERGE JOIN T2
  ON dbo.T1.col1 = dbo.T2.col1;
GO
分享到:
评论

相关推荐

    Microsoft SQL Server 2005技术内幕: T-SQ程序设计.pdf

    该书解释并比较了SQL Server 2000和SQL Server 2005在数据库开发相关问题上的解决方案,深入讨论了SQL Server 2005中新增的T-SQL编程特性,包含了大量的代码示例、表示例和逻辑难题以帮助数据库开发人员和管理员理解...

    SQL Server Native Client 11-sqlncli-11驱动

    3. **性能优化**:SQL Server Native Client 11针对SQL Server进行了优化,提供了诸如预读取、批量插入和并行执行等功能,以提高数据访问速度。此外,它还支持高级查询计划缓存,进一步提升查询性能。 4. **高级...

    SQL Server存储LOB数据的策略与方法.pdf

    在探讨SQL Server数据库中存储LOB(Large Object)数据的策略与方法时,首先需要理解几个核心概念和原理。LOB数据类型通常是指存储在数据库中非常大的二进制或者字符型数据,例如文档、图表和图像文件。这些数据的...

    sqlserver2005-jdbc驱动、sqlserver2008-jdbc驱动、mysql-jdbc驱动、oracle驱动-

    - Oracle JDBC驱动提供对Oracle数据库的全面访问,包括高级特性如PL/SQL、LOB处理、多数据源连接和分布式事务。 4. JDBC驱动的使用: - 要使用这些驱动,开发者首先需要在项目中添加对应的jar文件,然后通过`...

    SQL Server 2005数据库ppt

    3. **改进的安全性**:SQL Server 2005提供了一套全面的安全机制,包括角色基础的访问控制、加密功能和审计机制,以保护敏感数据免受未授权访问。 4. **Business Intelligence(BI)工具**:SQL Server 2005集成了...

    sqlServer的jar包

    这个JAR包是针对SQL Server特定功能的扩展,它提供了对SQL Server特有的特性和功能的支持,如存储过程、事务管理、XML处理、大型对象(LOB)操作等。开发者可以利用这个库来充分利用SQL Server的功能,实现高级的...

    SQL Server Native Client 9.0~11.0(32位和64位).rar

    - 支持SQL Server特有的功能,如XML数据类型、大型对象(LOB)处理、空间数据类型、透明网络IP(TNI)以及SQL Server 2005引入的Service Broker。 - 提供对SQL Server的变更数据捕获(Change Data Capture, CDC)...

    SQL Server Native Client大全(官网下载整理9,10,11)

    SQL Server Native Client是微软开发的一款专门用于连接Microsoft SQL Server数据库的客户端库,它结合了ODBC(Open Database Connectivity)和OLE DB(Object Linking and Embedding, Database)接口的功能,为应用...

    SQL server 与Oracle开发比较

    - SQL Server有主数据文件、次要数据文件和日志文件。 5. **SQL扩展与查询工具** - Oracle使用PL/SQL,这是一种嵌入在SQL中的过程编程语言,常用工具包括sql*plus、isql*plus和pl/sql。 - SQL Server使用...

    SQL Server 2000完结篇系列之二:彻底掌握SQL Server 2000体系结构(二)-存储结构

    SQL Server 2000是微软推出的一款关系型数据库管理系统,它在企业级应用中扮演着重要的角色。在深入理解其体系结构时,存储结构是不可或...通过深入学习和实践,你将能够更有效地管理和维护SQL Server 2000数据库系统。

    Microsoft SQL Server 2005 JDBC Driver

    它遵循Java Database Connectivity (JDBC) API规范,使得Java开发者能够方便地在SQL Server 2005数据库上执行SQL语句,进行数据的存取和管理。 JDBC是Java中用于访问数据库的标准接口,它定义了一系列的类和方法,...

    SQL Server 2005技术内幕 存储引擎

    3. **锁和事务**:SQL Server 2005使用多种锁机制来确保数据一致性,包括行级锁、页级锁和表级锁。同时,事务管理确保了操作的原子性、一致性、隔离性和持久性,这是数据库系统可靠性的基石。 4. **缓冲池**:内存...

    sql server 技术内幕

    这本书详细介绍了SQL Server 2005的存储引擎,这是数据库管理的核心组件,负责数据的存储、检索、更新和删除。书中涵盖了以下几个关键知识点: 1. **表和索引结构**:包括堆表、B树索引、聚集索引和非聚集索引的...

    SqlServer与Oracle差异

    总结,虽然Sql server和Oracle在基本功能上有许多共同之处,但它们在数据类型、语法和某些高级特性上存在显著差异。开发者在选择使用哪种数据库时,需要根据项目需求、性能要求、团队熟悉度等因素综合考虑。了解这些...

    SQLserver2000驱动包

    这个驱动包主要用于Java应用程序,它提供了必要的接口和功能,使得Java程序能够通过JDBC(Java Database Connectivity)API与SQL Server 2000建立连接,执行SQL查询、数据操作和事务处理等任务。 1. JDBC驱动概述:...

    SQLSERVER中对Image(大对象)对象操作

    在SQL Server数据库管理系统中,`Image`数据类型用于存储大对象(LOB,Large Object),如图片、文档或二进制数据。本篇文章将深入探讨如何在SQL Server中对`Image`对象进行操作,包括插入、查询、更新和删除等基本...

    C# 存取SqlServer中的Image类型.txt

    Image类型字段在SQL Server中用于存储大对象(LOB)数据,如图像、二进制文件等。下面我们将详细探讨如何使用C#进行图像数据的读取和写入操作。 一、存储图像到SQL Server的Image字段 1. **准备图像数据** 首先,...

    SQL Server ,JDBC官方驱动包

    SQL Server 是微软公司推出的一款关系型数据库管理系统,广泛应用于企业级数据存储和管理。而Java Database Connectivity (JDBC) 是Java平台中用于访问数据库的标准Java API,它允许Java应用程序通过编写Java代码来...

    SQLserver、Oracle、Mysql区别.doc

    SQL Server、Oracle和MySQL是三种广泛应用的关系型数据库管理系统(RDBMS),各有其特点和优势。以下是对这三种数据库系统的详细对比: 1. **SQL Server** - 开发商:由微软公司开发,主要应用于Windows操作系统。...

Global site tag (gtag.js) - Google Analytics