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

12 篇文章 0 订阅
7 篇文章 0 订阅

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  --删除游标


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值