2013-04-12 75 views
0

嗨我試圖從XML文件中獲取一些信息到我的MSSQL數據庫,任何人都可以發現錯誤。獲取XML信息到SQL

這裏是我的SQL代碼(現在的固定循環,對整個目錄和錯誤陷阱雲)

使用MYDB

IF OBJECT_ID('mydb..tempList') IS NOT NULL 
DROP TABLE tempList 

CREATE TABLE tempList ([FileName] VARCHAR(500)) 

--plain vanilla dos dir command with /B switch (bare format) 
INSERT INTO tempList 
EXEC MASTER..XP_CMDSHELL 'dir C:\Data\icecat\xmls /B' 


--delete the null values 
DELETE tempList WHERE [FileName] IS NULL 

-- Delete all the files that don't have xml extension 
DELETE tempList WHERE [FileName] NOT LIKE '%.xml' 

--this will be used to loop over the table 
alter table tempList add id int identity 
go 

truncate table dbo.XMLImportRelated --in case you want to rerun just this codeblock 

DECLARE @Directory varchar(100) 
SELECT @Directory = 'C:\Data\icecat\xmls\' 

DECLARE @FileExist int 
DECLARE @FileName varchar(500),@DeleteCommand varchar(1000),@FullFileName varchar(500), @SQLFullFileName varchar(500) 

DECLARE @ProductID int 
DECLARE @RelatedID int 

- 這是使我們知道循環持續多久 DECLARE @LoopID INT,@MaxID INT SELECT @LoopID =分鐘(ID),@ MaxID = MAX(ID) FROM tempList

WHILE @LoopID <= @MaxID 
BEGIN 

SELECT @FileNAme = filename 
FROM tempList 
WHERE id = @LoopID 

SELECT @FullFileName = @Directory + @FileName 

EXEC xp_fileexist @FullFileName , @FileExist output 
IF @FileExist =1 --sanity check in case some evil person removed the file 
BEGIN 

DECLARE @x XML, @sql NVARCHAR(MAX); 
BEGIN TRY 
SELECT @sql = N'SELECT @X = CONVERT(xml,[ICECAT-interface],2) 
FROM OPENROWSET(BULK ''' + @FullFileName + ''' ,SINGLE_BLOB) 
---------------------^^ escaped quotes are important 
AS Import([ICECAT-interface]);'; 

EXEC sp_executesql @sql, N'@x XML OUTPUT', @x OUTPUT; 

END TRY 
BEGIN CATCH 
PRINT 'Error' 
END CATCH 

INSERT XMLImportRelated ([ProductID],RelatedID) 

select P1.X.value('@ID', 'int') as ProductID, 
     P2.X.value('@ID', 'int') as RelatedID 


from @X.nodes('/ICECAT-interface/Product') as P1(X) 
     cross apply P1.X.nodes('ProductRelated') as PR(X) 
     cross apply PR.X.nodes('Product') as P2(X) 


-- SET @DeleteCommand = 'del ' + @Directory + @FileName 
END 


SELECT @LoopID = min(id) 
FROM tempList 
WHERE id > @LoopID 
END 

,這裏是一個URL到XML我嘗試使用

http://www.metatronics.co.uk/XML/3326091.xml

感謝傢伙,我不斷收到空值,因此它的東西不多IM失蹤,但看着這一切早上我去瘋狂, 約翰之後。

+0

您提供的是要求用戶輸入用戶名和密碼,所以我不能看到該文件的URL。你的表結構是什麼? –

+0

對不起,這裏有一些文件的相關位是在底部 –

+0

ARRRRgh它太長http://www.metatronics.co.uk/XML/3326091.xml這個位置不會要求和憑據我移動它 –

回答

0

在您提供的XML中,/ICECAT-interface/Product/ProductRelatedpath中有四個屬性不是其中之一。

嘗試:

SELECT 
    Product.value('@ID', 'int'), 
    Product.value('@Category_ID','int'), 
    Product.value('@Reversed','bit'), 
    Product.value('@Preferred','bit') 
FROM ... 

如果你不是想挑從/ICECAT-interface/Product/ProductRelated/Product您需要更改nodes子句包括Product,並指定在字段列表中使用有屬性的屬性。

要從ProductRelated和Product中獲取值,您應該使用cross apply

select PR.X.value('@ID', 'int') as ProductRelatedID, 
     PR.X.value('@Category_ID','int') as Category, 
     PR.X.value('@Reversed','bit') as Reversed, 
     PR.X.value('@Preferred','bit') as Preferred, 
     P.X.value('@ID', 'int') as ProductID, 
     P.X.value('@Prod_id', 'nvarchar(500)') as Prod_id, 
     P.X.value('@ThumbPic', 'nvarchar(500)') as ThumbPic, 
     P.X.value('@Name', 'nvarchar(500)') as Name 
from @X.nodes('/ICECAT-interface/Product/ProductRelated') as PR(X) 
    cross apply PR.X.nodes('Product') as P(X) 

更新:

select P1.X.value('@ID', 'int') as ProductID, 
     PR.X.value('@ID', 'int') as ProductRelatedID, 
     PR.X.value('@Category_ID','int') as Category, 
     PR.X.value('@Reversed','bit') as Reversed, 
     PR.X.value('@Preferred','bit') as Preferred, 
     P2.X.value('@ID', 'int') as ProductID, 
     P2.X.value('@Prod_id', 'nvarchar(500)') as Prod_id, 
     P2.X.value('@ThumbPic', 'nvarchar(500)') as ThumbPic, 
     P2.X.value('@Name', 'nvarchar(500)') as Name 
from @X.nodes('/ICECAT-interface/Product') as P1(X) 
    cross apply P1.X.nodes('ProductRelated') as PR(X) 
    cross apply PR.X.nodes('Product') as P2(X) 

結果:

ProductID ProductRelatedID Category Reversed Preferred ProductID Prod_id   ThumbPic          Name 
----------- ---------------- ----------- -------- --------- ----------- ------------------ ----------------------------------------------- -------------------------------------------------------------- 
3326091  57050234   258   0  0   1220634  WS-C2960-24-S  http://images.icecat.biz/thumbs/1220634.jpg  Catalyst 2960-24-S 
3326091  68385107   258   0  0   2708530  WS-C2960-48TC-S-RF http://images.icecat.biz/thumbs/2708530.jpg  Catalyst 2960-48TC-S 
3326091  57050235   258   0  0   1220633  WS-C2960-24TC-S http://images.icecat.biz/thumbs/1220633.jpg  Catalyst 2960-24TC-S 
3326091  57050236   258   0  0   3328069  WS-C2960-24PC-S http://images.icecat.biz/thumbs/3328069.jpg  WS-C2960-24PC-S 
3326091  0    182   0  0   16646  DFE-690TXD   http://images.icecat.biz/thumbs/16646.jpg  32 Bit Card Bus 10/100Mbps Ethernet Adapter with Direct Port 
3326091  57050238   258   0  0   1710023  WS-C2960-48TT-S http://images.icecat.biz/thumbs/1710023.jpg  Catalyst 2960-48TT-S 
3326091  0    182   0  0   468298  LC102    http://images.icecat.biz/thumbs/468298.jpg  LAN PC Card Gigabit 
3326091  57050239   258   0  0   1220632  WS-C2960-48TC-S http://images.icecat.biz/thumbs/1220632.jpg  Catalyst 2960-48TC-S 
3326091  0    883   0  0   1549666  UT012                UTP Cable Cat5E 3M Grey 
3326091  57050233   258   0  0   1710024  WS-C2960-8TC-S  http://images.icecat.biz/thumbs/1710024.jpg  Catalyst 2960-8TC-S 
3326091  0    182   0  0   1959688  LC103    http://images2.icecat.biz/thumbs/1959688.jpg Gigabit Network Card PCI Express 
3326091  57050237   258   0  0   3326672  WS-C2960-24LC-S http://images.icecat.biz/thumbs/3326672.jpg  CATALYST 2960 24 10/100 Port & 8 PoE 
3326091  0    244   0  0   1320852  BR-6624   http://images.icecat.biz/thumbs/1320852.jpg  BR-6624 Load Balancing Router 
3326091  0    182   0  0   489937  LC101    http://images.icecat.biz/thumbs/489937.jpg  Gigabit Network Card PCI 
3326091  0    182   0  0   72364  DGE-530T   http://images.icecat.biz/thumbs/72364.jpg  32-Bit 10/100/1000 Base-T PCI Adapter 
3326091  0    1505  0  0   1318217  N-707522   http://images.icecat.biz/thumbs/1318217.jpg  UTP Crimping Tang 
3326091  0    244   0  0   1684822  20002427   http://images2.icecat.biz/thumbs/1684822.jpg FRITZ!Box Fon WLAN 7270 International Edition 
3326091  0    883   0  0   1318218  N-707523   http://images.icecat.biz/thumbs/1318218.jpg  UTP CAT5 Pullbox Network Cable, 100m 
3326091  0    1172  0  0   1318117  N-707521   http://images.icecat.biz/thumbs/1318117.jpg  UTP Shieldcaps for RJ45, 10 Pieces 
3326091  0    244   0  0   859910  20002387   http://images.icecat.biz/thumbs/859910.jpg  FRITZ!Box Fon WLAN 7170 Annex A 
3326091  0    244   0  0   859908  20002388   http://images.icecat.biz/thumbs/859908.jpg  FRITZ!Box Fon WLAN 7170 Annex B 
+0

非常感謝Mikael,我一直在搞亂,我可以從一個不同的節點中選擇數據嗎?選擇說明即產品和產品相關的一位 –

+0

@JohnSpencer當然。我已經更新了答案。 –

+0

再次感謝Mikael我很感激你的時間,我明天會回來和這個混淆,我會更新你。 再次感謝 約翰。 –