2013-10-28 24 views
1

我試圖從「StkPart」屬性中選擇每個PartNum,WarehouseCode和OnhandQty,並從「Plant」屬性中選擇工廠。此xml文件中只有一個「工廠」,「工廠」將與「StkPart」屬性中的每行關聯。
例如:爲什麼選擇查詢不起作用?

PartNum WarehouseCode OnhandQty Plant 
1. 10-12345  Corona   150  MfgSys 
2. 10-12351  Cork    1  MfgSys 
3. 10-51617a Here   198  MfgSys 
4. 10-97654  There   67  MfgSys 

這是我一直想(XML代碼是在底部): 此代碼的工作,並把數據輸入我的表:

USE Database 
GO 

CREATE TABLE XMLwithOpenXML 
(
Id INT IDENTITY PRIMARY KEY, 
XMLData XML, 
LoadedDateTime DATETIME 
) 

INSERT INTO XMLwithOpenXML(XMLData, LoadedDateTime) 
SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE() 
FROM OPENROWSET(BULK 'C:\Test\StockStatusReport30597.XML', SINGLE_BLOB) AS x; 

SELECT * FROM XMLwithOpenXML 

然後我儘量選擇數據,但是這是行不通的:

USE Database 
GO 

DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX) 

SELECT @XML = XMLData FROM XMLwithOpenXML 

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML 

SELECT PartNum 
FROM OPENXML(@hDoc, 'ReportDataSet/PartNum') 
WITH 
(
PartNum [varchar](50) '@PartNum' 
) 

EXEC sp_xml_removedocument @hDoc 
GO 

如何獲得上面的代碼工作?

下面是XML文件下載: http://wikisend.com/download/101282/StockStatusReport30597.XML

+0

的XML有未指定的命名空間。 – Laurence

+0

@Laurence感謝您的回覆。我是XML新手。未指定的命名空間與我的問題有什麼關係? – Kevin

+0

這意味着任何試圖使用你的例子的人都會在insert語句中出錯。 – Laurence

回答

1

這可能有助於

Declare @xml xml = N'<ReportDataSet 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
    ... 
    </ReportDataSet>' 

Select 
    N.value('PartNum[1]', 'varchar(20)') PartNum, 
    N.value('WarehouseCode[1]', 'varchar(20)') WarhouseCode, 
    N.value('OnhandQty[1]', 'int') OnhandQty, 
    @xml.value('(/ReportDataSet/Plant/Plant)[1]', 'varchar(20)') Plant 
from 
    @xml.nodes('/ReportDataSet/StkPart') as T(n) 

我剪了一些東西出來下面的例子來適應SQLFiddle的侷限性,但它從問題的查詢中加入適當的命名空間:

Example SQLFiddle

你的大數據的例子,你需要設置默認的命名空間查詢:

With xmlnamespaces (default 'http://www.epicor.com/Mfg/100') 
Select 
    N.value('PartNum[1]', 'varchar(20)') PartNum, 
    N.value('WarehouseCode[1]', 'varchar(20)') WarhouseCode, 
    N.value('OnhandQty[1]', 'decimal(10,2)') OnhandQty, 
    @xml.value('(/ReportDataSet/Plant/Plant)[1]', 'varchar(20)') Plant 
from 
    @xml.nodes('/ReportDataSet/StkPart') as T(n) 
+0

好的,很棒,但是如何在xml代碼被引入sql表後將其添加到適當的名稱空間中? – Kevin

+0

你的大數據集已經有了它們。 – Laurence

+0

@Kevin我已經試過對你的大數據集,並意識到你也有一個默認的命名空間。這需要在查詢中指定。我已經更新了答案。 – Laurence