Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用OpenXML_C#_Asp.net_Sql Server_Xml_Openxml - Fatal编程技术网

C# 使用OpenXML

C# 使用OpenXML,c#,asp.net,sql-server,xml,openxml,C#,Asp.net,Sql Server,Xml,Openxml,我正在将XML传递给SQL Server存储过程,并尝试将其存储在临时表中 存储过程如下所示: 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 '

我正在将XML传递给SQL Server存储过程,并尝试将其存储在临时表中

存储过程如下所示:

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的示例:

<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包含子节点详细信息时,此SP将正常工作。如果我没有子节点,它将无法工作。你能指出我错在哪里吗?

完全重写答案:

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
输出:

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为例。它从SQL Server 2008开始提供

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)

当xml包含子节点时,此sp将正常工作。如果我没有子节点,它将无法工作这看起来像一个。整个问题的答案都是错误的!。首先:OPENXML已经过时,不应该再使用了。有更好的方法。其次,如果要处理XML,应该使用适当的数据类型,而不是VARCHARMAX,这更糟糕,因为它不能正确处理特殊字符。我建议你:开始一个新问题。解释你拥有什么,解释你想要什么,以及你迄今为止尝试了什么。请给出一个示例和预期的输出。我得到一个错误,当我试图编写您的第一个代码时,XMLDT方法“nodes”只能在xml类型的列上调用。可能是什么问题?xmldoc变量的数据类型是什么?应该是xml,我已经将sql存储过程的输入参数VARCHARMAX更改为xml。但是在执行sp时,我得到了无效的对象名“d”。我不知道名为d的对象,我建议您使用新的xml变量,比如declare@x xml select@x=cast@xmldoc作为xml,然后在节点中使用@x。或者最简单的解决方案是在charindex'detail'时设置@xmldoc=case,@xmldoc>0,然后设置@xmldoc elsereplace@xmldoc,结束时,将添加wmpty详细信息节点,使用这种方法,您的OPENXML应该可以正常工作。我正在尝试仅使用OPENXML。现在又回到原点了。没有子节点的节点不会出现记录。你能告诉我这辆车能做什么吗?