Tagi na forum.

Windows 14205 SQL Server 2132
sieci 6796 Windows XP 1921
SQL 6578 Outlook 1838
SBS 3868 Uprawnienia 1777
Windows 2003 2781 IIS 1636
Windows Server 2588 Office 1516
DNS 2315 Skrypt 1499

pokaż wszystkie tagi na forum

ExtendedProperty generowanie listy XML

kipst 2011-08-25 12:27:55
0
avatar
 
 
Witam.
Mam problem z utworzeniem zapytania zwracającego listę extended property dla obiektu w formacie XML.
Dla mojego przykładowego obiektu zwracany jest następujący rezultat:



[Kod]
SELECT name, value FROM sys.extended_properties
WHERE major_id = 898922374

name value
-------------------------
Autor GKP
Opis Trigger robi to i tamto




Następnie chce uzyskać listę w następującym formacie XML:


[Kod]
<Properties ObjectID="898922374">
<Autor>GKP</Autor>
<Opis>Trigger robi to i tamto</Opis>
</Properties>




 
Z tym założeniem, że ilość tych Properties jest zmienna.
 
Narazie wyprodukowałem takie zapytanie jednak nie jest to co chcę uzyskać:
 



[Kod]
SELECT
major_id as [Properties/@ObjectID],
name as [Properties/name],
value as [Properties/Value]
FROM sys.extended_properties
FOR XML Path('')




 
Proszę o podpowiedź jak uzyskać listę w takim formacie.
 
Pozdrawiam Grzegorz
tagi: XML


vezdohan  2011-08-25 13:20:45 #1
0
avatar
 
 
A co jest w tym złego:

SELECT
major_id as [Properties/@ObjectID],
name as [Properties/Autor],
value as [Properties/Opis]
FROM sys.extended_properties
FOR XML Path('')

C3PO  2011-08-25 13:37:29 #1.1
0
avatar
 
 
Kolega chce mieć dane (nazwy właściwości) w nazwach elementów :-)--Pozdrawiam,Paweł PotasińskiSQL Server MVP, PLSSUG member

Pozdrawiam,
Paweł Potasiński
Partner Technology Advisor | Microsoft Polska 
Blog SQLGeekPLSSUG

vezdohan  2011-08-25 14:17:53 #1.1.1
0
avatar
 
 
Auć coś jak to?

declare @x xml
select @x=
replace(
replace(
replace(
replace(
replace(
replace(
(SELECT
major_id as [Properties/@ObjectID],
name as [Properties/name],
value as [Properties/value],
name as [Properties/name_]
FROM sys.extended_properties
FOR XML Path('')
),'<name>','<')
,'</name>','>')
,'<value>','')
,'</value>','')
,'<name_>','</')
,'</name_>','>')
select @x

C3PO  2011-08-25 14:27:39 #1.1.1.1
0
avatar
 
 
Fajne. Ale nie zadziała zgodnie z oczekiwaniami kolegi, bo nie pogrupuje mu właściwości po ObjectID. Już kiedyś przerabiałem temat i niestety - zawsze trzeba było robić zapytanie na zasadzie małych kroków, najpierw grupowanie, potem do XML-a.--Pozdrawiam,Paweł PotasińskiSQL Server MVP, PLSSUG member

Pozdrawiam,
Paweł Potasiński
Partner Technology Advisor | Microsoft Polska 
Blog SQLGeekPLSSUG

kipst  2011-08-25 13:52:28 #1.2
0
avatar
 
 
Twoje rozwiązanie generuje błędny wynik co do założeń.



[Kod]
<Properties ObjectID="898922374">
<Autor>Autor</Autor>
<Opis>GKP</Opis>
</Properties>
<Properties ObjectID="898922374">
<Autor>Opis</Autor>
<Opis>Trigger robi to i tamto</Opis>
</Properties>




 
Tak jak pisałem ilość tych właściwości jest zmienna. A chcę pobrać wszystkie należące do danego obiektu

C3PO  2011-08-25 14:15:36 #1.2.1
0
avatar
 
 
Brzydkie jak noc i pewnie jest mnóstwo przypadków, których nie uwzględniłem, ale na dobry początek:



[Kod]
select
major_id as [@ObjectID],
convert(xml, props)
from
(
select distinct
p.major_id,
(
select
convert(xml, '<' + convert(nvarchar(4000), name) + '>' + convert(nvarchar(4000), value) + '</' + convert(nvarchar(4000), name) + '>')
from sys.extended_properties where major_id = p.major_id
for xml path ('')
) as props
from sys.extended_properties p
) as q
for xml path ('Properties')




--Pozdrawiam,Paweł PotasińskiSQL Server MVP, PLSSUG member

Pozdrawiam,
Paweł Potasiński
Partner Technology Advisor | Microsoft Polska 
Blog SQLGeekPLSSUG

kipst  2011-08-25 14:29:32 #1.2.2
0
avatar
 
 
Póki co rozwiązałem to za pomocą dynamicznego pivot'a.
 



[Kod]
DECLARE @SQL as VARCHAR (MAX)
DECLARE @Columns AS VARCHAR (MAX)
DECLARE @ObjectID as int
SET @ObjectID = 882206293
SELECT @Columns=COALESCE(@Columns + ',','') + QUOTENAME(name)
FROM
(
SELECT DISTINCT name From sys.extended_properties WHERE major_id = @ObjectID
) AS Prop
ORDER BY Prop.name

SET @SQL=N'
WITH PivotData AS
(
SELECT
name, value
FROM sys.extended_properties
WHERE major_id = ' + CAST(@ObjectID as nvarchar(264)) + '
)
SELECT * FROM PivotData
PIVOT
(
MIN(value)
FOR name
IN (' + @Columns + ')
) AS PivotResult
FOR XML PATH(''Properties'') '

EXEC (@SQL)




 

vezdohan  2011-08-25 14:24:10 #2
0
avatar
 
 
Przyznam się że taki xml do obróbki będzie bardzo trudny, Nie można założyć niczego o elementach.

vezdohan  2011-08-25 14:51:14 #2.1
0
avatar
 
 
Ja inaczej:

declare @x xml
select @x=
replace(
replace(
replace(
replace(
replace(
replace(
replace(
replace(
(SELECT distinct
major_id as [@ObjectID],
(select
name as [name],
value as [value],
name as [name_]
FROM sys.extended_properties i
where i.major_id = sys.extended_properties.major_id
FOR XML Path(''))
FROM sys.extended_properties
FOR XML Path('Properties')
),'>','>')
,'<','<')
,'<name>','<')
,'</name>','>')
,'<value>','')
,'</value>','')
,'<name_>','</')
,'</name_>','>')
select @x

Ale jedyną moją motywacją było: się uparłem.

Udziel odpowiedzi

avatar
Treść wpisu:

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.

Idź na górę strony