【发布时间】:2020-03-13 20:31:09
【问题描述】:
我有一个可能有多个签名元素的 xml。我不知道每个根的签名元素的数量,但我需要按此元素分组,以便为每个根元素获得一行。
您认为使用价值方法可行吗? 我已阅读 (Getting nth Element from last in a xml in Sql Server) 如何确定元素数量,但不允许在值方法中使用范围。
这是我的代码:
declare @xml as xml ='<root>
<Row>
<proceeding>
<signatures>XII GU 609/18</signatures>
<signatures>XII GUp 392/18</signatures>
<commissioner_name></commissioner_name>
<court_department>XII Wydział Gospodarczy</court_department>
<administrator_function>syndyk</administrator_function>
<court_name>Sąd Rejonowy w Gliwicach</court_name>
<administrator_name></administrator_name>
<commissioner_deputy_name />
<administrator_licence_number>920</administrator_licence_number>
</proceeding>
<msig_entry>
<chapter>0</chapter>
<issue_date>2019-11-15</issue_date>
<url>http://www.imsig.pl/pozycja/2019/221/58729</url>
<section>3</section>
<sequential_number />
<signature>BMSiG-58674/2019</signature>
<position_number>58729</position_number>
<yearly_number>221</yearly_number>
</msig_entry>
<id>BMSiG-58674/2019</id>
<order>
<order_date />
<expiration_period>14</expiration_period>
<expiration_date>2019-11-29</expiration_date>
</order>
</Row>
</root>'
select
isnull(a.x.value('(entity/info/cleaned_name)[1]','varchar(max)'),'') as 'Nazwa podmiotu'
,isnull(a.x.value('(entity/info/first_name)[1]','varchar(max)'),'') as 'Imię'
,isnull(a.x.value('(entity/info/last_name)[1]','varchar(max)'),'') as 'Nazwisko'
,isnull(a.x.value('(entity/info/legal_form)[1]','varchar(max)'),'') as 'Forma prawna'
,isnull(a.x.value('(entity/info/ownership_type)[1]','varchar(max)'),'') as 'Forma własności'
,isnull(a.x.value('(entity/info/commencement_date)[1]','date'),'') as 'Data rozpoczęcia działalności'
,isnull(a.x.value('(entity/address/zip_code)[1]','varchar(255)'),'')+' '+isnull(a.x.value('(entity/address/town)[1]','varchar(255)'),'')
+' '+isnull(a.x.value('(entity/address/street)[1]','varchar(255)'),'')+' '+ISNULL(a.x.value('(entity/address/house_number)[1]','varchar(255)'),'')
+case when ISNULL(a.x.value('(entity/address/flat_number)[1]','varchar(255)'),'')<>'' then +'/'+a.x.value('(entity/address/flat_number)[1]','varchar(255)')
else '' end as Adres
,isnull(a.x.value('(proceeding/court_name)[1]','varchar(max)'),'') as 'Nazwa sądu'
,isnull(a.x.value('(proceeding/court_department)[1]','varchar(max)'),'') as 'Nazwa wydziału'
,isnull(a.x.value('(proceeding/signatures)[1]','varchar(max)'),'') as 'Sygnatura' --grupowanie!
,isnull(a.x.value('(proceeding/commissioner_name)[1]','varchar(max)'),'') as 'Sędzia komisarz'
,isnull(a.x.value('(proceeding/commissioner_deputy_name)[1]','varchar(max)'),'') as 'Zastępca sędziego komisarza'
,isnull(a.x.value('(proceeding/administrator_name)[1]','varchar(max)'),'') as 'Nadzorca w postępowaniu'
,isnull(a.x.value('(proceeding/administrator_function)[1]','varchar(max)'),'') as 'Funkcja nadzorcy'
,isnull(a.x.value('(order/order_date)[1]','date'),'') as 'Data wydania postanowienia'
,isnull(a.x.value('(order/expiration_period)[1]','varchar(20)'),'') as 'Okres do działania (w dniach)'
,isnull(a.x.value('(order/expiration_date)[1]','date'),'') as 'Koniec okresu do działania'
,isnull(a.x.value('(msig_entry/chapter)[1]','varchar(max)'),'') as 'Rozdział MSiG'
,isnull(a.x.value('(msig_entry/section)[1]','varchar(max)'),'') as 'Sekcja MSiG'
,isnull(a.x.value('(msig_entry/signature)[1]','varchar(max)'),'') as 'Sygnatura ogłoszenia'
,isnull(a.x.value('(msig_entry/issue_date)[1]','date'),'') as 'Data publikacji ogłoszenia w MSiG'
,isnull(a.x.value('(content/text)[1]','varchar(max)'),'') as 'Treść ogłoszenia'
from @xml.nodes('/root/Row') as a(x)
【问题讨论】:
-
三个提示:感谢可执行示例,这是一个很大的帮助,但下次您可能会将其减少到所需的最低限度。第二:请添加预期的输出。您的问题尚不完全清楚...第三:请使用您的 RDBMS(供应商 和版本)进行标记。
[tsql]和代码指向[sql-server],但 XML 支持是高度特定于产品的。 -
@Shnugo,感谢您的准确观察,实际上。我刚刚编辑了我的问题。
标签: xml tsql sql-server-2012