编辑:我已经在堆栈溢出处找到了相关的答案: XQuery [value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'
之前我还没有在T-SQL中处理过XML,而且我正在修改现有的遗留存储过程,并且如果通过反复试验就选择最多。
然而,我遇到了一个问题,即试验和错误证明是无效的,而且非常缓慢。认为是时候吸引堆栈溢出大师了!这是一些XML
<?xml version=\"1.0\"?> <Notification xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"> <NotificationId>0</NotificationId> <UserNotifications> <UserNotification> <UserNotificationId>0</UserNotificationId> <NotificationId>0</NotificationId> <UserId>13514</UserId> <MessageTypeId>1</MessageTypeId> </UserNotification> <UserNotification> <UserNotificationId>0</UserNotificationId> <NotificationId>0</NotificationId> <UserId>13514</UserId> <MessageTypeId>2</MessageTypeId> </UserNotification> </UserNotifications> </Notification>
有问题的存储过程接受上述XML作为参数:
CREATE PROCEDURE [dbo].[Notification_Insert] @ParametersXml XML AS BEGIN
XML包含子“UserNotification”元素。我想选择每个UserNotification的UserId,MessageTypeId到这样的表中
UserId | MessageTypeId 13514 | 1 13514 | 2
显然,收藏的大小并不固定。
我目前的尝试(不起作用)是这样的:
DECLARE @UserDetails TABLE ( UserId INT, MessageTypeId INT); INSERT INTO @UserDetails (UserId, MessageTypeId) SELECT Tab.Col.value('@UserId','INT'), Tab.Col.value('@MessageTypeId','INT') FROM @ParametersXml.nodes('/Notification/UserNotifications[not(@xsi:nil = "true")][1]/UserNotification') AS Tab(Col)
但这绝不会插入任何东西......
我现在已经玩了一段时间而且没有任何快乐:(
答案 0 :(得分:0)
我建议通过以下链接。我发现它们简短而快速地通过:
http://blog.sqlauthority.com/2009/02/12/sql-server-simple-example-of-creating-xml-file-using-t-sql/ http://blog.sqlauthority.com/2009/02/13/sql-server-simple-example-of-reading-xml-file-using-t-sql/
答案 1 :(得分:0)
我通过进一步搜索堆栈溢出找到了解决这个问题的方法。
INSERT INTO @UserDetails (UserId, MessageTypeId) SELECT UserNotification.value('UserId[1]','INT'), UserNotification.value('MessageTypeId[1]','INT') FROM @ParametersXml.nodes('//Notification/UserNotifications') AS x(Coll) cross apply @ParametersXml.nodes('//Notification/UserNotifications/UserNotification') as un(UserNotification)