这是我从前端传递到存储过程的表的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
有人可以告诉我可能做错了什么。数据未保存在数据库表中。
答案 0 :(得分:1)
您的查询是正确的,但您的XML数据格式不正确,Name
和ID
的结束标记是自动关闭标记,即使您在其间有开始标记和数据。他们需要正确关闭标签而不是自动关闭标签。见下文:
<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