Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7933194
  • 博文数量: 124
  • 博客积分: 2880
  • 博客等级: 少校
  • 技术积分: 873
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-16 17:08
文章分类

全部博文(124)

文章存档

2011年(28)

2010年(60)

2009年(36)

我的朋友

分类: 数据库开发技术

2009-10-14 20:03:14

SQL Server 2005 - 善用 OPENROWSET 函数来存取大型对象(LOB)

我们在Visual Basic 2005 档案 IO 与资料存取秘诀」一书的第七章,详细探讨了如何于前端程序处理大型对象(LOB)。有读者询问,SQL Server 2005 本身是否提供任何的 Transact-SQL 陈述式来处理 LOB 呢?答案当然是肯定的,而且具备相关处理能力的 Transact-SQL 陈述式还不只一个。不过在本文中,我们将把焦点摆在 OPENROWSET 函数。

SQL Server 2005 OPENROWSET 函数能够一次就完成远程数据的连结与存取作业。OPENROWSET 函数在使用的形式上就好比是一个资料表,比方说,您可以在 SELECT 陈述式的 FROM 子句中参考 OPENROWSET 函数,此外,视 OLE DB 提供者的能力而定,您也可以在 INSERTUPDATE DELETE 陈述式中把 OPENROWSET 函数当成目标数据表来使用。

特别值得一提的是,SQL Server 2005 OPENROWSET 函数加入了 BULK 数据列集提供者,使得您可以直接从文字文件、XML 文件、以及图档等档案中读取数据。此意味着,从现在开始,您可以在一道非常简单的 INSERT INTO…SELECT 陈述式中使用 OPENROWSET 函数来将内含大量数据的档案内容存入数据表的字段中。

OPENROWSET BULK 选项自变量可以精确控制数据读取的开始与结束位置、如何处理错误、以及资料要如何被解译。比方说,您可以要求将数据文件读取成 varbinaryvarchar nvarchar 型别的单一数据列与单一字段的数据列集。

我想光说不练是没有用的在,以下的程序代码中,我们会先建立一个数据表,然后使用 INSERT INTO…SELECT 陈述式来新数据记录。请特别注意我们如何使用 OPENROWSET 函数将文字文件(.txt)与图档(.jpg)的内容直接存入数据表的「自传」「玉照」字段中:

USE 北风贸易;
GO

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id =
           OBJECT_ID(N'dbo.
练习资料表') AND type in (N'U'))
DROP TABLE dbo.
练习资料表
GO

--建立数据表
CREATE TABLE dbo.
练习资料表(
 
编号 int IDENTITY(1,1) NOT NULL,
 
姓名 nvarchar(10) NULL,
 
性别 nvarchar(2) NULL,
 
自传 nvarchar(max) NULL,
 
玉照 varbinary(max) NULL,
 );
GO

--新增第一笔数据(包括 NCLOB BLOB 在内)
INSERT INTO dbo.
练习资料表
(
姓名,
性别,
自传,
玉照
)
SELECT '
章立民' AS 姓名, '' AS 性别,
 * FROM
 OPENROWSET
    (BULK 'C:\Temp\Employee-A156401174.txt', SINGLE_NCLOB) AS
自传,
 OPENROWSET
    (BULK 'C:\Temp\Employee-A156401174.jpg', SINGLE_BLOB) AS
玉照;
GO

--新增第二笔数据(包括 NCLOB BLOB 在内)
INSERT INTO dbo.
练习资料表
(
姓名,
性别,
自传,
玉照
)
SELECT '
章立民' AS 姓名, '' AS 性别,
 * FROM
 OPENROWSET
    (BULK 'C:\Temp\Employee-A156401174.txt', SINGLE_NCLOB) AS
自传,
 
OPENROWSET
    (BULK 'C:\Temp\Employee-A156404535.jpg', SINGLE_BLOB) AS
玉照;
GO

章立民研究室敬上

期待更多精彩,敬请关注:

阅读(1266) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~