首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OpenXML

使用OpenXML
EN

Stack Overflow用户
提问于 2016-09-10 15:56:48
回答 1查看 407关注 0票数 1

我将XML传递给Server存储过程,并尝试将其存储在#temp表中。

存储过程如下:

代码语言:javascript
复制
EXEC sp_xml_preparedocument @i OUTPUT  
,@XMLDOC  

 SELECT Id  
 ,UserId  
 ,ModifiedOn  
 ,ModifiedBy  
 ,ModifiedIp  
 ,DetailId
INTO #temp  
FROM OPENXML(@i, '/Root/Rec/Detail', 1) WITH (  
id INT '../@Id'  
,UserId INT '../@UserId'  
,ModifiedOn DATETIME '../@ModifiedOn'  
,ModifiedBy INT '../@ModifiedBy'  
,ModifiedIp VARCHAR(15) '../@ModifiedIp'  
,DetailId INT '@DetailId' 

)  

EXEC sp_xml_removedocument @i  

select * from #temp

以及XML的示例:

代码语言:javascript
复制
<root>
    <rec id="I001" userid="316" modifiedon="9/10/2016 02:33:56 PM" modifiedby="316" modifiedip="::1" UserDetail="System.Collections.Generic.List`1[Dto.UserDetail]">
    </rec>
</root>

当XML包含子节点(detail)时,这个SP将正常工作。如果我没有子节点,它就不能工作。你能指出我哪里出了问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-10 19:01:04

完全重写答案:

代码语言:javascript
复制
DECLARE @i int,
        @XMLDOC VARCHAR(max)= "INPUT XML"

EXEC sp_xml_preparedocument @i OUTPUT  
,@XMLDOC  

SELECT *
INTO #temp
FROM (
SELECT  m.Id,
        m.UserId,
        m.ModifiedOn,
        m.ModifiedBy,  
        m.ModifiedIp,  
        COALESCE(det.DetailId, -1) as DetailId
FROM OPENXML(@i, '/root/rec', 1) WITH (  
        id INT '@availabilityid',  
        UserId INT '@userid',  
        ModifiedOn DATETIME '@modifiedon',
        ModifiedBy INT '@modifiedby',  
        ModifiedIp VARCHAR(15) '@modifiedip'
) as m
LEFT JOIN (
    SELECT  Id,
            DetailId
    FROM OPENXML(@i, '/root/rec/userturnarounddetail', 1) WITH (  
            id INT '../@availabilityid',
            DetailId INT '@availabilitydetailid' 
            )
    ) as det
    ON m.id =det.id
) p


EXEC sp_xml_removedocument @i  

select * from #temp

输出:

代码语言:javascript
复制
Id      UserId  ModifiedOn              ModifiedBy  ModifiedIp  DetailId
113367  316     2016-09-11 11:01:09.000 316         ::1         300100
0       316     2016-09-11 11:01:11.000 316         ::1         -1

编辑

.nodes 方法为例。它可以从Server 2008开始使用。

代码语言:javascript
复制
DECLARE @XMLDOC xml 

SELECT @XMLDOC = 
'<root>
    <rec id="I001" userid="316" modifiedon="9/10/2016 02:33:56 PM" modifiedby="316" modifiedip="::1" UserDetail="System.Collections.Generic.List1[Dto.UserDetail]">
    </rec>
</root>'

SELECT  ISNULL(d.f.value('@id','nvarchar(15)'),d.f.value('../@id','nvarchar(15)')) as id,
        ISNULL(d.f.value('@userid','int'),d.f.value('../@userid','int')) as UserId,
        ISNULL(d.f.value('@modifiedon','datetime'),d.f.value('../@modifiedon','datetime')) as ModifiedOn,
        ISNULL(d.f.value('@modifiedby','int'),d.f.value('../@modifiedby','int')) as ModifiedBy,
        ISNULL(d.f.value('@modifiedip','nvarchar(15)'),d.f.value('../@modifiedip','nvarchar(15)')) as ModifiedIp,
        d.f.value('@detailid','int') as DetailId
FROM @XMLDOC.nodes('//*//*') as d(f)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39427870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档