使用XML参数的SQL查询

时间:2015-09-18 12:49:05

标签: tsql xquery-sql

编辑:我已经在堆栈溢出处找到了相关的答案: 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)

但这绝不会插入任何东西......

我现在已经玩了一段时间而且没有任何快乐:(

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我通过进一步搜索堆栈溢出找到了解决这个问题的方法。

我需要的查询(感谢XQuery [value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'


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)