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