1

我有一个类似于以下内容的 XML 列;

DECLARE @str AS VARCHAR(8000)

SET @str = '<Root xmlns="http://myurl.com/services/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
           <Notifications>
               <Notification>
                  <NotificationDate>2012-08-16</NotificationDate>
                  <Scopes>
                    <NotificationScope>
                        <Code>a</Code>
                    </NotificationScope>  
                    <NotificationScope>
                        <Code>b</Code> 
                    </NotificationScope>
                  </Scopes>
                </Notification>
                <Notification>
                  <NotificationDate>2012-08-20</NotificationDate>
                  <Scopes>
                    <NotificationScope>
                        <Code>a</Code>
                    </NotificationScope>
                  </Scopes>
                </Notification>
            </Notifications></Root>'

我希望能够计算每个通知的 NotificationScope 元素数。例如,我正在寻找类似的东西;

Notification Date                   Count
 2012-08-16                          2
 2012-08-20                          1

事实上,由于这些数据实际上是从数据库列中获得的,我真的只对返回那些具有任何通知日期且计数大于 1 的记录感兴趣。

到目前为止,我想出的只是以下内容,但这只是给了我一个计数;

declare @xmlvar XML;
set @xmlvar = (SELECT cast(@str AS XML))
;WITH XMLNAMESPACES('http://myurl.com/services/' AS p)
SELECT * FROM (
select @xmlvar.value('count(/p:Root/p:Notifications/p:Notification/p:Scopes/p:NotificationScope)', 'INT') AS 'NotificationScopeCount',
       @xmlvar.value('count(/p:Root/p:Notifications/p:Notification/p:NotificationDate)', 'INT') AS 'NotificationDateCount'
 ) a WHERE NotificationScopeCount > NotificationDateCount

但理想情况下,我也希望能够获得相关的日期。如果这是一种可怕的处理方式,请原谅我,我以前在 SQL 中没有使用过多的 XML 数据类型。

4

1 回答 1

1

你可以尝试使用这样的东西:

;WITH XMLNAMESPACES('http://myurl.com/services/' AS p)
SELECT
    NotificationDate = Notif.value('(p:NotificationDate)[1]', 'DATE'),
    CodeCount = Notif.value('count(p:Scopes/p:NotificationScope/p:Code)', 'int')
FROM
    @xmlvar.nodes('/p:Root/p:Notifications/p:Notification') AS Tbl(Notif)

给我一个输出:

在此处输入图像描述

于 2012-10-16T06:14:08.720 回答