Sql 为什么select查询不起作用?

Sql 为什么select查询不起作用?,sql,sql-server,xml,Sql,Sql Server,Xml,我试图从“StkPart”属性中选择每个PartNum、WarehouseCode和OnhandQty,并从“plant”属性中选择工厂。此xml文件中只有一个“Plant”,并且“Plant”将与“StkPart”属性中的每一行相关联。 例如: PartNum WarehouseCode OnhandQty Plant 1. 10-12345 Corona 150 MfgSys 2. 10-12351 Cork

我试图从“StkPart”属性中选择每个PartNum、WarehouseCode和OnhandQty,并从“plant”属性中选择工厂。此xml文件中只有一个“Plant”,并且“Plant”将与“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文件: 这可能会有所帮助

Declare@xml=N'
...
'
挑选
N.value('PartNum[1]”,'varchar(20)'PartNum,
N.value('WarehouseCode[1],'varchar(20)')仓库代码,
N.value('OnhandQty[1],'int')OnhandQty,
@value(“(/ReportDataSet/Plant/Plant)[1]”,“'varchar(20)”Plant
从…起
@xml.nodes('/ReportDataSet/StkPart')作为T(n)
为了适应SqlFIDLE的局限性,我从下面的示例中删去了一些内容,但它使用了问题中的查询,并添加了适当的名称空间:

对于大数据示例,您需要为查询设置默认名称空间:

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)
这可能会有帮助

Declare@xml=N'
...
'
挑选
N.value('PartNum[1]”,'varchar(20)'PartNum,
N.value('WarehouseCode[1],'varchar(20)')仓库代码,
N.value('OnhandQty[1],'int')OnhandQty,
@value(“(/ReportDataSet/Plant/Plant)[1]”,“'varchar(20)”Plant
从…起
@xml.nodes('/ReportDataSet/StkPart')作为T(n)
为了适应SqlFIDLE的局限性,我从下面的示例中删去了一些内容,但它使用了问题中的查询,并添加了适当的名称空间:

对于大数据示例,您需要为查询设置默认名称空间:

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)

xml有未指定的名称空间。@Laurence感谢您的响应。我不熟悉XML。未指定的名称空间与我的问题有什么关系?这意味着任何试图使用您的示例的人都会在insert语句中出错。由于上面的Laurences语句,我在链接中添加了XML文件。这是没有删除的整个文件。xml有未指定的名称空间。@Laurence感谢您的响应。我不熟悉XML。未指定的名称空间与我的问题有什么关系?这意味着任何试图使用您的示例的人都会在insert语句中出错。由于上面的Laurences语句,我在链接中添加了XML文件。这是一个没有删除的完整文件。好吧,太棒了,但是一旦xml代码被放入sql表中,我该如何向它添加适当的名称空间呢?@Kevin我已经尝试过你的大数据集,并意识到你也有一个默认名称空间。这需要在查询中指定。我已经更新了答案。你太棒了!谢谢你的帮助!上帝保佑!好吧,太棒了,但是一旦xml代码被放入sql表中,我该如何向其添加适当的名称空间呢?@Kevin我已经尝试过使用您的大数据集,并意识到您也有一个默认名称空间。这需要在查询中指定。我已经更新了答案。你太棒了!谢谢你的帮助!上帝保佑!