[SQL Server] Problemen met FOR XML AUTO

Pagina: 1
Acties:

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 14-05 18:56
Ik heb de volgende query:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
SELECT 
    MenuGroup.title,
    MenuGroup.url,
    dbo.ConcatRoles( MenuGroup.id ) AS UserGroups,
    Menu.title,
    Menu.url,
    dbo.ConcatRoles( Menu.id ) AS UserGroups,
    MenuItem.title,
    MenuItem.url,
    dbo.ConcatRoles( MenuItem.id ) AS UserGroups,
    Link.title,
    Link.url,
    dbo.ConcatRoles( Link.id ) AS UserGroups
FROM 
    Menu MenuGroup
INNER JOIN
    Menu Menu
ON
    MenuGroup.id = Menu.parentID
INNER JOIN
    Menu MenuItem
ON
    Menu.id = MenuItem.parentID
INNER JOIN
    Menu Link
ON
    MenuItem.id = Link.parentID
WHERE
    MenuGroup.parentID IS NULL
FOR XML AUTO

Zoals je ziet bevat deze meerdere joins op dezelfde table. Deze query haalt een menustructuur op uit een tabel die er als volgt uit ziet:
code:
1
2
3
4
5
6
7
id  parentID    title       url 
------------------------------------------------
1   NULL        Menu1       bla
2   NULL        Menu2       bla 
3   1           Menu1.1 aaaa
4   3           Menu1.1.1   wddw
5   2           Menu2.1     de

De functie dbo.ConcatRoles( MenuGroup.id ) maakt een string met toegestane useroles( ; gescheiden) aan de hand van het menuID. Nu wil ik deze in m'n xml in elke node als "UserGroups" attribuut terugzien. Ik krijg echter de foutmelding "Column name 'UserGroups' is repeated. The same attribute cannot be generated more than once on the same XML tag.". Ik snap wel wta dit betekend, maar niet hoe ik het op kan lossen. Als ik ...AS MenuGroup.UserGroups doe dan krijgt het attribuut de naam "MenuGroup.UserGroups", dus dat is het niet. Iemand?

Roomba E5 te koop


Verwijderd

er staat teveel keer "as Usergroups", je zal ze toch een andere naam moeten geven......
Als ik ...AS MenuGroup.UserGroups doe dan krijgt het attribuut de naam "MenuGroup.UserGroups", dus dat is het niet
wrom nie?

[ Voor 50% gewijzigd door Verwijderd op 10-02-2005 19:52 ]


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 14-05 18:56
Omdat het attribuut in de xml "UserGroups" moet heten.

Anders krijg ik dit:
<MenuGroup MenuGroup.UserGroup="group1">
<Menu Menu.UserGroup="group1">
...
</Menu>
</MenuGroup>

Roomba E5 te koop


Verwijderd

ik denk dat het niet echt anders op te lossen is. Zonder een unique alias o.i.d. snapt die for xml auto niet wat je bedoeld. Kan je niet de usergroups anders aan elkaar vast concatten zodat je maar 1 attribuut hebt dat usergroups heet?!

anders,

waarom ben je zo gebrand op het "Usergroups"-heten???

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 14-05 18:56
Er is een component dat aande hand van deze xml een menustructuur opbouwd. De rollen in UserGroups worden vergeleken met de rol die de gebruiker in het domein heeft. Het component zoekt voor elke item in het menu naar het attribuut UserGroups om te bepalen of dit item zichtbaar is of niet.

Edit: opgelost!

Ik heb het zo gedaan:

1. Ik zet het hele menu in een temptable die hetzelfde is als het menu maar dan met een extra veld Usergroups. In dit veld zijn de rollen al aan elkaar geplakt.
2. Daarna gaat de FOR XML AUTO query wel goed, omdat hij nu het verschil ziet tussen de verschillende tabelnamen.

[ Voor 36% gewijzigd door sig69 op 11-02-2005 09:47 ]

Roomba E5 te koop


Verwijderd

En dit dan?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
SELECT 
    MenuGroup.title,
    MenuGroup.url,
    dbo.ConcatRoles( MenuGroup.id ) + ';' + dbo.ConcatRoles( Menu.id ) +';' +   dbo.ConcatRoles( MenuItem.id ) + ';' + dbo.ConcatRoles( Link.id )  AS UserGroups,
    Menu.title,
    Menu.url,
       MenuItem.title,
    MenuItem.url,
      Link.title,
    Link.url,
    FROM 
    Menu MenuGroup
INNER JOIN
    Menu Menu
ON
    MenuGroup.id = Menu.parentID
INNER JOIN
    Menu MenuItem
ON
    Menu.id = MenuItem.parentID
INNER JOIN
    Menu Link
ON
    MenuItem.id = Link.parentID
WHERE
    MenuGroup.parentID IS NULL
FOR XML AUTO


(wel even zorgen dat je function geen null retourneert, omdat anders je string null wordt

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 14-05 18:56
Dit werkt niet, nu worden alle rechten van alle menuitemns in de MenuGroup node gepropt.

Roomba E5 te koop

Pagina: 1