sql server 2000使得以xml匯出資料變得更加簡單,但在sql server 2000中匯入xml資料並對其進行處理則有些麻煩。本文介紹在sql server中讀取xml檔案的簡單做法。
sql server 2000
使得以xml
匯出資料變得更加簡單,但在
sql server 2000
中匯入xml
資料並對其進行處理則有些麻煩。
如果你參考
books online
(bol
),你會發現有相關的條目,包括
openxml
以及openrowset
。所有的這些例子都支援將
xml文字作為已經宣告的變數,這對於經常處理文字的使用者來說非常方便,但對於希望在開發中讀取
xml檔案並進行相應處理的開發人員來說就不是這樣了。處理這樣的問題,或許最好從內到外來對其進行分析。
openxml
是乙個rowset
函式(即返回乙個
rowset
),它的工作方式類似於
rowset
函式openquery
和openrowset
。使用openxml
可以對xml
資料執行
joins
操作而無需首先匯入資料。你還可以將其同
insert
、select
、update
以及delete
等操作聯合使用。
然而,要使用
openxml
,你必須執行兩項
openquery
和openrowset
並不需要的任務。這兩項任務需要兩個系統儲存程序。
第乙個是
sp_xml_preparedocument
,它將讀取特定的
xml文字並將其內容提取到記憶體中。其語法如下:
sp_xml_preparedocument @hdoc = output,
[, @xmltext = ]
[, @xpath_namespaces =
具體引數如下:
@hdoc
:指向某記憶體區域的控制代碼(從作用上看等同於乙個指標),相關資料存放在這裡。注意這是乙個輸出變數,當該程序執行後,該變數將包含指向
xml檔案內容在記憶體位址的控制代碼。由於你需要在隨後使用此結果,因此要確保對其進行儲存;
@xmltext
:實際上你所希望處理的
xml文字;
@xml_namespaces
:為了正常操作你的
xml資料所需要的任何名字空間索引(
namespace references
)。注意在這裡出現的任何
url都需要用尖括號(
<>
)括起來;
假設所傳遞的這些引數都有效,並且
xml文件存在,那麼你的
xml資料就會被存放到記憶體中去。現在你就可以呼叫
sp_xml_preparedocument
,傳遞存放有
xml檔案的變數,然後執行
openxml
。語法如下:
openxml(idocint [in],rowpatternnvarchar[in],[flagsbyte[in]])
[with (schemadeclaration
tablename)]
openxml
所接收的引數。請參閱
bol以獲取更多資訊。在
transact-sql reference
中查詢openxml
。現在我們已經到達了最後的步驟。所有剩下的工作就是匯入乙個實際的
xml檔案到
sql並進行處理(很奇快為什麼所有的
bol示例都沒有涉及到這一關鍵的部分)。(我必須感謝我的同事
billy pang
所給予的幫助。他幫助我解決這個問題,並給出了**
——儘管出於本文需要我對**進行了裁減。謝謝
billy
!)基本的技巧是,將檔案逐行按文字讀取。然後把所有讀取的行連線為乙個大的
varchar
變數。最後,將變數傳遞給前面所說的**。
以下就是讀取檔案並將其內容存放到某變數的**:
declare @filename varchar(255)
declare @execcmd varchar(255)
declare @y int
declare @x int
declare @filecontents varchar(8000)
create table #tempxml(pk int not null identity(1,1), thisline varchar(255))
set @filename = 'c:tempcurrentsettings.xml'
set @execcmd = 'type ' + @filename
set @filecontents = ''
insert into #tempxml exec master.dbo.xp_cmdshell @execcmd
select @y = count(*) from #tempxml
set @x = 0
while @x <> @y
begin
set @x = @x + 1
select @filecontents = @filecontents + thisline from #tempxml where pk
= @x
end
select @filecontents as filecontents
drop table #tempxml
現在在變數
@filecontents
變數中你已經獲得了檔案的全部內容。所需要做的只是將變數通過
@xmltext
引數傳遞給
sp_xml_preparedocument
,然後再呼叫
openxml
。有了這種解決辦法,對
xml文件進行各種處理就成為了可能。你可以將
xml文件同
sql**連線在一起而無需匯入資料,然後對這些資料進行
insert
、pdate
和delete
等任何操作。
從SQL Server中讀取XML檔案
如果你參考books online bol 你會發現有相關的條目,包括openxml以及 openrowset。所有的這些例子都支援將xml文字作為已經宣告的變數,這對於經常處理文字的使用者來說非常方便,但對於希望在開發中讀取xml檔案並進行相應處理的開發人員來說就不是這樣了。處理這樣的問題,或許最...
Sqlserver 從XML檔案中讀取配置資訊
如何在sqlserver中從外部xml檔案中讀取配置資訊呢?該問題源自一家企業的筆試資訊有感。一xml檔案內容 指令碼 declare x xml declare hdocid int 從外部檔案讀取檔案內容 有很多種方式 xp cmdshell 呼叫作業系統的顯式文字檔案內容的擴充套件儲存過程。b...
SQL SERVER中XML命名空間
有xml如下 create table a params xml insert into a params values 202014111101 013920130005 name0005 0prod.1000000100088400 msgbody節點聲名了命名空間,用平常的查詢語句是查不到資料...