UploadnhiềufileXMLvàocộtkiểudữliệuXML
Ngu
ồ
n:quantrimang.com
Các quản trị viên cơ sở dữliệu (CSDL) SQL Server thường có một số nhu
cầu như import nhiềufilevào một bảng trong CSDL. Bài này sẽ thảo luận
đến việc làm thế nào để uploadnhiềufile (đặc biệt là file XML) vàocộtkiểu
dữ liệuXML của CSDL SQL Server.
Điều kiện cần
a. Phải đảm bảo xp_cmdshell đã được cho phép. Nếu chưa được, hãy thực thi
mộ
t số câu lệnh dưới đây
use master
go
sp_configure 'show advanced options',1
go
reconfigure with override
go
sp_configure 'xp_cmdshell',1
go
reconfigure with override
go
b. Tạo một CSDL và bảng được dùng cho việc import này bằng các câu lệnh
dưới. Nếu không bạn có thể sử dụng CSDL đang có sẵn.
USE [master]
GO
/****** Object: Database [XMLTest]
Script Date: 04/17/2007 01:49:43 ******/
IF EXISTS (SELECT name FROM sys.databases WHERE name =
N'XMLTest')
DROP DATABASE [XMLTest]
go
create database XMLTest
go
use XMLTest
go
c. Đảm bảo rằng bạn đã tạo một bảng với kiểudữliệu XML. Ngoài ra, hãy chắc
chắn có ít nhất một cột trong bảng có thể chứa giá trị của tên file như sau
use [XMLTest]
/****** object: table [dbo].[myimage]
script date: 09/10/2006 21:55:46 ******/
if exists (select * from sys.objects
where object_id = object_id(N'[MYXML]') and type in (N'u'))
drop table [MYXML]
go
create table [MYXML] (
[id] int identity(1,1),
[XML File Name] varchar(100),
[Data] XML)
Go
d. Giả sử bạn muốn upload toàn bộ file .bmp từ thư mục C:\XML (tham khảo
hình 1 và 2) vào bảng “MYXML” trong lược đồ “dbo” trên CSDL “XMLTest”
Hình 1
Nội dung ví dụ Customer5.xml
<?xml version="1.0" standalone="yes"?>
<Customer>
<CustomerLogInfo>
<Date>2007-03-31T06:40:38.0000000-05:00</Date>
<user>Rainbow.River</user>
<Userid>1AE</Userid>
<ls>A-Accessible</ls>
<eqtid>761</eqtid>
<es>Stopped</es>
<tp>30</tp>
</CustomerLogInfo>
<CustomerLogInfo>
<Date>2007-03-31T06:40:38.0000000-05:00</Date>
<user>Rainbow.River</user>
<Userid>1AE</Userid>
<ls>Not-Accessible</ls>
<eqtid>870</eqtid>
<es>Stopped</es>
<tp>30</tp>
</CustomerLogInfo>
<CustomerLogInfo>
<Date>2007-03-31T06:40:38.0000000-05:00</Date>
<user>Rainbow.River</user>
<Userid>1AE</Userid>
<ls>A-Accessible</ls>
<eqtid>97F</eqtid>
<es>Started</es>
<tp>30</tp>
</CustomerLogInfo>
</Customer>
e. Hãy tạo một thủ tục usp_uploadXMLFilesm [sử dụng copy và paste đoạn mã
dưới đây hoặc download file usp_uploadXMLFiles
có sẵn]. Việc tạo này là tạo
một thủ tục lưu trữ usp_uploadXMLfiles trên csdl chủ vì vậy nó có thể thực thi và
gọi bất kỳ csdl nào.
USE [master]
GO
/****** Object: StoredProcedure
[dbo].[usp_uploadXMLfiles] Script Date: 09/10/2006
23:33:34 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id =
OBJECT_ID(N'[dbo].[usp_uploadXMLfiles]') AND type in (N'P',
N'PC'))
DROP PROCEDURE [dbo].[usp_uploadXMLfiles]
go
set quoted_identifier off
go
create procedure usp_uploadXMLfiles
@databasename varchar(128),
@schemaname varchar(128),
@tablename varchar(128),
@FileNameColumn varchar(128),
@xmlcolumn varchar(128),
@path varchar(500),
@filetype varchar(10),
@printorexec varchar(5) = 'print'
as
set nocount on
declare @dircommand varchar(1500)
declare @insertquery varchar(2000)
declare @updatequery varchar(2000)
declare @count int
declare @maxcount int
declare @filename varchar(500)
set @count=1
set @dircommand = 'dir /b '+@path+@filetype
create table #dir (name varchar(1500))
insert #dir(name) exec master xp_cmdshell @dircommand
delete from #dir where name is NULL
create table #dir2 (id int identity(1,1),name
varchar(1500))
insert into #dir2 select name from #dir
select * from #dir2
set @maxcount = ident_current('#dir2')
print 'set quoted_identifier off'
print 'go'
while @count <=@maxcount
begin
set @filename =(select name from #dir2 where id = @count)
set @insertquery = 'Insert into
['+@databasename+'].['+@schemaname+'].['+@tablename+']
([' +@filenamecolumn +']) values ("'+@filename+'")'
set @updatequery = 'update
['+@databasename+'].['+@schemaname+'].['+@tablename+']
set ['+@xmlcolumn+'] = (SELECT * FROM OPENROWSET(BULK
"'+@path+@filename+'", SINGLE_BLOB)AS x )
WHERE ['+@filenamecolumn +']="'+@filename+'"'
if @printorexec ='print'
begin
print @insertquery
print @updatequery
end
if @printorexec ='exec'
begin
set @insertquery='set quoted_identifier off' +
char(10)+char(13)+@insertquery
set @updatequery='set quoted_identifier off' +
char(10)+char(13)+@updatequery
exec (@insertquery)
exec (@updatequery)
end
set @count = @count +1
end
go
Thủ tục này chấp nhận các tham số sau:
@databasename = Tên của csdl có giản đồ và bảng đang tồn tại.
@schemaname = Giảm đồ csdl có bảng đang tồn tại
@tablename = Tên của bảng có các file sẽ được upload
@FileNameColumn = Tên của cột trong bảng có tên file để lưu trữ
@XMLcolumn = CộtkiểudữliệuXML hiện tại có file sẽ được lưu trữ như XML
@path = Đường dẫn của tất cả các file c
ần có để upload. Ví dụ “C:\Windows\”
@filetype = Loại file muốn upload. Ví dụ “*.XML”
@printorexec = Nếu “Print” được đặt như một tham số, nó sẽ tự tạo ra và hiển
thị các lệnh. Nếu “Exec” được đặt như một tham số, nó sẽ ngay lập tức thực thi
câu lệnh có ý nghĩa upload tất cả các file.
f. Thực thi thủ tục với tham số printorexec=’print’ theo đoạn mã dưới đây
Exec master [usp_uploadXMLfiles]
@databasename ='XMLTest',
@schemaname ='dbo',
@tablename ='MYXML',
@FileNameColumn ='XML File Name',
@XMLcolumn = 'Data',
@path = 'c:\XML\',
@filetype ='*.xml',
@printorexec ='print'
Thủ tụ
c này sẽ tự tạo ra tất cả các câu lệnh cần thiết cho việc tạo một dòng cho
từng file và update dòng với file thuộc tính theo đoạn mã sau.
set quoted_identifier off
go
Insert into [XMLTest].[dbo].[MYXML] ([XML File Name])
values ("Customer1.xml")
update [XMLTest].[dbo].[MYXML] set [Data] = (SELECT *
FROM OPENROWSET(BULK "c:\XML\Customer1.xml",
SINGLE_BLOB)AS x )
WHERE [XML File Name]="Customer1.xml"
Insert into [XMLTest].[dbo].[MYXML] ([XML File Name])
values ("Customer2.xml")
update [XMLTest].[dbo].[MYXML] set [Data] = (SELECT *
FROM OPENROWSET(BULK "c:\XML\Customer2.xml",
SINGLE_BLOB)AS x )
WHERE [XML File Name]="Customer2.xml"
Insert into [XMLTest].[dbo].[MYXML] ([XML File Name])
values ("Customer3.xml")
update [XMLTest].[dbo].[MYXML] set [Data] = (SELECT *
FROM OPENROWSET(BULK "c:\XML\Customer3.xml",
SINGLE_BLOB)AS x )
WHERE [XML File Name]="Customer3.xml"
Insert into [XMLTest].[dbo].[MYXML] ([XML File Name])
values ("Customer4.xml")
update [XMLTest].[dbo].[MYXML] set [Data] = (SELECT *
FROM OPENROWSET(BULK "c:\XML\Customer4.xml",
SINGLE_BLOB)AS x )
WHERE [XML File Name]="Customer4.xml"
Insert into [XMLTest].[dbo].[MYXML] ([XML File Name])
values ("Customer5.xml")
update [XMLTest].[dbo].[MYXML] set [Data] = (SELECT *
FROM OPENROWSET(BULK "c:\XML\Customer5.xml",
SINGLE_BLOB)AS x )
WHERE [XML File Name]="Customer5.xml"
Insert into [XMLTest].[dbo].[MYXML] ([XML File Name])
values ("Customer6.xml")
update [XMLTest].[dbo].[MYXML] set [Data] = (SELECT *
FROM OPENROWSET(BULK "c:\XML\Customer6.xml",
SINGLE_BLOB)AS x )
WHERE [XML File Name]="Customer6.xml"
Insert into [XMLTest].[dbo].[MYXML] ([XML File Name])
values ("Customer7.xml")
update [XMLTest].[dbo].[MYXML] set [Data] = (SELECT *
FROM OPENROWSET(BULK "c:\XML\Customer7.xml",
SINGLE_BLOB)AS x )
WHERE [XML File Name]="Customer7.xml"
g. Thực thi thủ tục với tham số printorexec=’exec’ theo đoạn mã dưới
Exec master [usp_uploadXMLfiles]
@databasename ='XMLTest',
@schemaname ='dbo',
@tablename ='MYXML',
@FileNameColumn ='XML File Name',
@XMLcolumn = 'Data',
@path = 'c:\XML\',
@filetype ='*.xml',
@printorexec ='exec'
Đoạn mã sẽ upload toàn bộ các filexml
h. Giờ thì chúng ta sẽ truy vấn bảng sử dụng câu lệnh SQL thực hiện như đoạn
dưới
use XMLTest
go
select * from myxml
go
Thủ tục này sẽ trả về kết quả như hình 2:
Hình 2
i. Kích lên các kết nối dữliệuXML để phát sinh kết quả như dưới đây
<Customer>
<CustomerLogInfo>
<Date>2007-03-31T06:40:38.0000000-05:00</Date>
<user>Dancing.Doll</user>
<Userid>1AE</Userid>
<ls>A-Accessible</ls>
<eqtid>761</eqtid>
<es>Stopped</es>
<tp>30</tp>
</CustomerLogInfo>
<CustomerLogInfo>
<Date>2007-03-31T06:40:38.0000000-05:00</Date>
<user>Dancing.Doll</user>
<Userid>1AE</Userid>
<ls>Not-Accessible</ls>
<eqtid>870</eqtid>
<es>Stopped</es>
<tp>30</tp>
</CustomerLogInfo>
<CustomerLogInfo>
<Date>2007-03-31T06:40:38.0000000-05:00</Date>
<user>Dancing.Doll</user>
<Userid>1AE</Userid>
<ls>A-Accessible</ls>
<eqtid>97F</eqtid>
<es>Started</es>
<tp>30</tp>
</CustomerLogInfo>
</Customer>
. import nhiều file vào một bảng trong CSDL. Bài này sẽ thảo luận
đến việc làm thế nào để upload nhiều file (đặc biệt là file XML) vào cột kiểu
dữ liệu XML. Upload nhiều file XML vào cột kiểu dữ liệu XML
Ngu
ồ
n:quantrimang.com
Các quản trị viên cơ sở dữ liệu (CSDL) SQL Server thường