使用存储过程将XML中的Html数据保存到sql

时间:2016-06-03 21:14:37

标签: mysql sql sql-server stored-procedures insert

这是我从前端传递到存储过程的表的Xml数据。

<ArrayOfUserData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <UserData>
             <Name>Dovyan<Name />
             <id>434556464<id />
     </UserData>
     <UserData>
             <Name>Alex<Name />
             <id>12345767<id />
    </UserData>
</ArrayOfUserData>

这是上面的xml我将作为@in_params传递给存储过程。这是存储过程。

USE [DATABASE]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [DATABASE].[sp_SaveUsertable]

(
   @in_params AS XML
)
AS

BEGIN
select
     T.x.value('./Name[1]','varchar(6)') as [Name] ,
     T.x.value('./id[1]','varchar(75)') as [id] 

into #Temp
from @in_params.nodes('/ArrayOfUserData/UserData') as T(x);


BEGIN TRANSACTION

INSERT INTO [dbo].[usertable](Name,id)
SELECT Name,id FROM #Temp AS T

COMMIT TRANSACTION
drop table #Temp;

END

有人可以告诉我可能做错了什么。数据未保存在数据库表中。

1 个答案:

答案 0 :(得分:1)

您的查询是正确的,但您的XML数据格式不正确,NameID的结束标记是自动关闭标记,即使您在其间有开始标记和数据。他们需要正确关闭标签而不是自动关闭标签。见下文:

<ArrayOfUserData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <UserData>
             <Name>Dovyan<Name />  --<-- This closing tag should be </Name>
             <id>434556464<id />   --<-- This closing tag should be </id>
     </UserData>
     <UserData>
             <Name>Alex<Name />    --<-- This closing tag should be </Name> 
             <id>12345767<id />    --<-- This closing tag should be </Name>
    </UserData>
</ArrayOfUserData>

如果修复了XML,那么存储过程应该可行。但是我会在你的程序中改变的一件事是使用Temp表,它是不需要的,只是简单地从你的xml参数插入到表中。像......那样......

BEGIN TRANSACTION

    INSERT INTO [dbo].[usertable](Name,id)
    select
          T.x.value('./Name[1]','varchar(6)') as [Name] 
         ,T.x.value('./id[1]','varchar(75)') as [id] 
    from @Xml.nodes('/ArrayOfUserData/UserData') as T(x);

COMMIT TRANSACTION