SQL中使用xp_cmdshell将硬盘中文件内容导入数据库

SQL同样拥有读取文件的功能,只要知道如何使用xp_cmdshell组件,即可实现,如下我将用一个简单例子做相关介绍:

首先,要知道xp_cmdshell是一个过于强大的组件,它可以直接以操作系统命令行解释器的方式执行给定的命令字符串,因此SQL Server 阻止了对组件 'xp_cmdshell' 的 过程 'sys.xp_cmdshell' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'xp_cmdshell'。有关启用 'xp_cmdshell' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。如下前四行(显红)就是启用了'xp_cmdshell'。

exec sp_configure 'show advanced options', 1;
reconfigure;
exec sp_configure 'xp_cmdshell', 1;
reconfigure; 

declare @GetFileNameOrder nvarchar(1000);   --指定一条操作系统指令
declare @FileTitTable table(Ftit nvarchar(1000));  --声明一个表变量,存储从文件夹中的文件里读到的内容
declare @FileFullName varchar(8000);                   --要读取的文件的全路径
set @GetFileNameOrder='dir G:\ASP.NET或C#\*.txt';   --这里设定了一条指令 “dir 路径”,意思就是读取指定路径下文件的列表
INSERT @FileTitTable 
exec xp_cmdshell @GetFileNameOrder    --执行xp_cmdshell 组件,将读取到的文件列表存到表变量中

delete from @FileTitTable where Ftit not like '%.txt%' or Ftit is null

update @FileTitTable set Ftit=substring(Ftit,37,120);   --这两行,你懂的,要连这都不懂,这文章,您还是甭看了

--下面执行游标,将读到的文件列表依次取出,然后获取文件内容

declare fCursor cursor for 
    select Ftit from @FileTitTable 
open fCursor                   
fetch next from fCursor into @FileFullName
while(@@fetch_status=0)
BEGIN    
declare @content varchar(8000);  --声明用来存文件内容的变量
set @FileFullName= 'G:\ASP.NET或C#\'+@FileFullName;  --设置文件全路径,'G:\ASP.NET或C#\' 是我电脑硬盘的一个文件夹
insert into Table_2(Fcontent) EXEC ('(SELECT * FROM OPENROWSET(BULK '''+@FileFullName+''',SINGLE_CLOB) as x)')    

--这里的“EXEC ('(SELECT * FROM OPENROWSET(BULK '''+@FileFullName+''',SINGLE_CLOB) as x)') ”。分解看一下exec()执行一

--字符串,里面的“(SELECT * FROM OPENROWSET(BULK '''+@FileFullName+''',SINGLE_CLOB) as x)”是一个字符串拼成的select语句

--SELECT * FROM后面的OPENROWSET(BULK '''+@FileFullName+''',SINGLE_CLOB) as x中的OPENROWSET BULK是行集提供程序

--用来导入大型对象的格式是这样的 SELECT * FROM  OPENROWSET(BULK  文件全路径,SINGLE_CLOB) as  表名字,

--SINGLE_CLOB是一个大型对象选项,他有三种选项SINGLE_BLOB 、SINGLE_CLOB、SINGLE_NCLOB,这些应该懂了,这条的意思就

--是 将对应路径下文件内容插入到指定表中

fetch next from fCursor into @FileFullName 
END 
close  fCursor        --关闭游标 
deallocate fCursor  --删除游标

posted on 2014-05-16 23:56  IOTer  阅读(492)  评论(0编辑  收藏  举报

导航