`
jiagyao
  • 浏览: 95873 次
  • 性别: 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存储LOB数据的策略与方法.pdf

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

    MYSQL,SQLSERVER,ORACLE常用的函数

    SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL&gt; select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual; A A ZERO SPACE --------- --------- --------- --------- ...

    Laravel开发-eloquent-serialized-lob

    Laravel开发-eloquent-serialized-lob 雄辩的序列化LOB是允许序列化LOB模式的Laravel5雄辩模型的特征。

    SQLDirect v6.5 for D5-10.1 Berlin Full Source

    connecting to the following SQL servers using 32-bit native application programming interfaces (API): Centura SQLBase Server 6(+), IBM DB2 Universal Database with CAE v5.2, Informix Server 7.2(+), ...

    eslint-config-lob:Lob存储库的共享ESLint配置

    eslint-config-lob Lob存储库的 用法 安装eslint和以下模块: npm i eslint eslint-config-lob --save-dev 使用以下对象在项目的根目录中创建一个.eslintrc文件: { extends : "eslint-config-lob" } 这将使用...

    java存lob数据到sybase数据库

    通过spring存blob和clob数据到sybase数据库中,压缩包里包含了三种方式,(1)spring+hibernate,切面事务(aop),存lob数据,(2)spring+hibernate存lob数据,(3)spring+jdbc存lob数据。

    前端开源库-lob

    前端开源库-lobLOB,LOB API包装

    lob笔记.doclob笔记.doc

    lob笔记.doclob笔记.doclob笔记.doc

    SQLDirect_6.2.0_Full_Source

    connecting to the following SQL servers using 32-bit native application programming interfaces (API): Centura SQLBase Server 6(+), IBM DB2 Universal Database with CAE v5.2, Informix Server 7.2(+), ...

    英语语料库LOB语料库

    LOB语料库 创建时间: 1970年代初 创建单位:英国Lancaster大学和挪威Oslo大学以及Bergen大学 规模层级: 100万词次 基本情况:研究当代英国英语,与美国英语对比,使用了TAGIT系统,以统计方式建立换算几率矩阵,提高标注...

    lob-stripe-app:使用 Lob 和 Stripe 的 Node.js 应用程序

    lob-stripe-app 使用 Lob 和 Stripe 的 Node.js 应用程序 发展 全局安装包 npm i jscs jshint nodemon - g 启动服务器 nodemon 检查样式 npm run style

    SQL Server中数据库文件的存放方式

    在SQL Server中,通过文件组这个逻辑对象对存放数据的文件进行管理。  我们看到的逻辑数据库由一个或者多个文件组构成  而文件组管理着磁盘上的文件.而文件中存放着SQL SERVER的实际数据。  为什么通过文件...

    ODI LOB 类型KM

    KM_IKM Oracle Incremental UpdateLOB.xml KM_LKM SQL to SQL LOB(JYTHON).xml 里面包含两个KM 可以直接用

    lob字段数据删除空间测试.txt

    测试oracle数据库中,lob字段在不同参数条件下,删除数据后占用空间的情况。 测试1 测试disable storage in row下的lob字段 测试2 测试非disable storage in row模式下 该模式为默认模式,既小于4k的数据不会存在lob...

    sqlserver 中一些常看的指标和清除缓存的方法

    如何查看磁盘I/O操作信息 SET STATISTICS IO ON 命令是一个 使 SQL Server 显示有关由 Transact-SQL 语句生成的磁盘活动量的信息。 我们在分析索引性能的时候,会非常有用。 启用了这个属性后,我们在执行 SQL 语句...

    详解SQL Server表和索引存储结构

    本文详细分析了SQL Server中表和索引结构存储的原理以及对于如何加快搜索速度和提高效率等方面做了详细的分析,以下是主要内容。 下图显示了表的存储组织,每张表有一个对应的对象ID,并且包含一个或多个分区,每个...

    oracle函数大全.doc

    SQL&gt; select mod(10,3),mod(3,3),mod(2,3) from dual; MOD(10,3) MOD(3,3) MOD(2,3) --------- --------- --------- 1 0 2 27.POWER 返回n1的n2次方根 SQL&gt; select power(2,10),power(3,3) from dual; POWER(2,10) ...

    lob-node:用于 Lob API 的 Node.js 包装器

    lob节点 API 的 Node.js 包装器。... 为获得最佳结果,请确保...lob-node 可以通过 npm 安装: $ npm install lob 要从最新源构建和安装: $ git clone git@github.com:lob/lob-node.git $ npm install 用法 const

Global site tag (gtag.js) - Google Analytics