快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

SQL Server 2005:数据类型最大值

事情开始得很简朴。MegaWare公司市场部门想要一个新的网站来发布文档,开发团队觉得使用SQL Server 2000数据库作为文档存储仓库会使事情变得简朴。Steve是MegaWare的数据库治理员,没有看出这有什么大问题;在数据库中存储文档,而不是使用文件系统,意味着服务器需要多做一些工作,但是它也会使得备份和治理轻易得多。数据库与文件系统变得不同步也应该是不可能的。 
  市场部门想要存储的许多文档都超过了8000个字节,那么很明显VARCHAR不是适合这项工作的数据类型。作为替代,TEXT数据类型被用来定义存放数据的字段。因为每个TEXT都能容纳2GB的内容,TEXT要存放市场部门的同事们扔进数据库的最大的文件也是没有问题的。
  数月过去了,市场用大量的无聊拷贝填满了整个数据库。但是这还不是Steve真正关心的问题。数据库舒畅地嗡嗡作响地运转着,每个人对项目的结果都很满足。
  直到公司的标语改变的那个重大的日子。市场部的团队认为“MegaWare: It’s really cool!”要比原来的“It’s MegaWare’s Way or the Highway!” 听起来更好。因为市场部团队已经将原来的标语嵌入了仓库中每个文档的页脚上,现在Steve的工作就是更改所有这些文档的页脚。
  “没有问题,” Steve想,打开SQL Server 查询分析器工具,执行了如下的T-SQL批处理:
  UPDATE MarketingDocuments
  SET Document =
  REPLACE(Document,
  ’It’’s MegaWare’’s Way or the Highway!’,
  ’MegaWare: It’’s really cool!)
  当他看到出现的错误消息的时候,Steve的轻松的微笑很快消失了,“替换函数的参数1,text数据类型无效。”
  替换函数在编写出来的时候,就对TEXT数据类型不起作用。同样也对CHARINDEX或者SUBSTRING不起作用――或者至少是他们在超过8千个字符的情况下不起作用。更进一步地讲,开发人员忘了处理TEXT或者IMAGE类型的本地变量;实际上不支持任何操作。即使是简朴地更新一个文档中的一个子字符串都需要用到晦涩的东西,以及难以使用的类似READTEXT和WRITETEXT的函数。而不是开发人员或者忙碌的数据库治理员因为想要弄清如何准确使用而采用了不同类型的函数消耗了时间。
  SQL Server的开发人员很幸运,他们将会拨开乌云见蓝天。SQL Server 2005引入了一系列新的被称为MAX的数据类型。这是VARCHAR,NVARCHAR和VARBINARY类型的扩展,这几种类型以前被限制在8000字节以下。MAX可以容纳高达2GB的数据,与TEXT和IMAGE相同――并且完全兼容所有的SQL Server内置的字符串函数。
  用MAX要害字定义一个某种MAX类型的变量与替代字符串的尺寸(为VARCHAR/NVARCHAR的时候)或者字节(为VARBINARY的时候)相同简朴。
  DECLARE @BigString VARCHAR(MAX)
  SET @BigString = ’abc’

  虽然这个变量可以自由地操纵,并且可以传递给任何的内置的字符串函数,兼容性仍旧不是没有问题。首先,开发人员不能期望指定了尺寸的VARCHAR和VARBINARY变量在达到8000个字节的极限的时候可以自动“升级”到MAX版本。例如,如下的批处理:
  DECLARE @String1 VARCHAR(4001)
  DECLARE @String2 VARCHAR(4001)
  SET @String1 = REPLICATE(’1’, 4001)
  SET @String2 = REPLICATE(’2’, 4001)
  SELECT LEN(@String1 + @String2)

  4001+4001=8002,但是指定了尺寸的VARCHAR的极限是8000。因为这两个变量中没有一个是MAX类型,LEN函数的结果就是8000,不是8002。在将两个变量连接的时候,一种简朴的修正方式就是声明这两个变量中的一个为VARCHAR(MAX)或者将其中的一个变量进行转变。与一个规定了尺寸的类型进行连接的时候,优先考虑MAX类型,最终结果是MAX类型。所以,以下批处理的结果是8002,正如我们期望的相同:
  DECLARE @String1 VARCHAR(4001)
  DECLARE @String2 VARCHAR(4001)
  SET @String1 = REPLICATE(’1’, 4001)
  SET @String2 = REPLICATE(’2’, 4001)
  SELECT LEN(CONVERT(VARCHAR(MAX), @String1) + @String2)

  在传递给字符串函数的时候,开发人员意识到字符串的原意在默认情况下是规定了尺寸的,而不是MAX类型,也是至关重要的。例如,以下查询的结果就很令人惊异:

本新闻共2

本新闻共2页,当前在第1页  1  2  


返回类别: 教程
上一教程: SQL Server 2000中的触发器使用
下一教程: 如何在存储过程中使用变量代替表名

您可以阅读与"SQL Server 2005:数据类型最大值"相关的教程:
· SQL SERVER 2005:数据类型最大值
· SQL SERVER关于字段中的数据类型
· SQL Server 中易混淆的数据类型
· SQL SERVER 中易混淆的数据类型
· SQL SERVER的数据类型
    微笑服务 优质保证 索取样品