Search

onze sponsors

microsoft_logo.gif


 

computrain_logo.JPG

Forum Login | Register
   Forum

 

Subject: syntax probleem ?
Prev Next
You are not authorized to post a reply.

Author Messages
Ruud BootsUser is Offline

Posts:62

12-07-2007 20:43:12 Alert 

   XML hulp gevraagd

Ik wil onderstaand extract uit een XML bestand omzetten naar SQL2005 maar krijg geen resultaat terug ,

Ik vermoed dat voor het element een andere syntax noodzakelijk is ?

ik gebruik nu de expressie:

DECLARE @xml XML

SELECT @xml = BulkColumn

FROM OPENROWSET(BULK 'E:\dump\1.4.29.1.2.xml', SINGLE_BLOB) AS tab

SELECT tab.Field.value('GUID Ώ]', 'varchar (50)') AS [GUID],

tab.Field.value('ParentGUID Ώ]', 'varchar (50)') AS ParentGUID,

tab.Field.value('Title Ώ]', 'varchar (50)') AS Title --etc

FROM @xml.nodes('//DiagInfo')

AS tab (Field)

 

--XML extract

-

-

-

control-ES

6.5

-

-

-

BBD87ACAC2AC4A95A045A7A7FDB704C2

C50C40BB13A5468D92E2FABC3FE88D71

Inlezen bestanden

7/9/2007

1.00

Jan Jansen

Jan Jansen

Update Pending

0

7/12/2007, 2:24:00 PM

Jan Jansen

Eigen Haard

--etc

André KammanUser is Offline
PASS Nederland

Posts:137


12-07-2007 22:06:13 Alert 

Hoi Ruud,

Als je alleen maar enkelvoudige velden wilt opvragen dan is het niet nodig om de xml.nodes functie te gebruiken :

Select
  @xml.value('DiagInfoΏ]/GUIDΏ]', 'varchar(50)') GUID,
  @xml.value('DiagInfoΏ]/ParentGUIDΏ]', 'varchar(50)') ParentGUID,
  @xml.value('DiagInfoΏ]/TitleΏ]', 'varchar(50)') Title

Zelfs geen FROM, where is the fun in that :-)

Groeten,

André
p.s. : Wellicht een overbodig opmerking maar ".value" is case sensitive ".Value" werkt niet.
En XML nodes zijn ook case sensitive, "ParentGUID" moet dus in de xml ook "ParentGUID" heten en niet "ParentGuid".

EDIT : Er lijkt een probleempje met het weergeven van "[blokhaak openen]één[blokhaak sluiten", dit zie je in het forum als "[Omega][blokhaak sluiten]"

Ruud BootsUser is Offline

Posts:62

13-07-2007 09:50:28 Alert 
Hoi André,

Bedankt voor je reactie en vereenvoudigde expressie. Ik vermoed dat mijn post niet helemaal correct is overgekomen, ik mis de elementen in meegestuurd voorbeeld, zoals ook het < control: > element welke mogelijk met een andere expressie moet worden benaderd ?

Ik heb in ieder geval je code toegepast op het XML bestand maar helaas nog geen resultaat,
dit is de output:
GUID ParentGUID Title
NULL NULL NULL

Enig idee ?

groet
Ruud

André KammanUser is Offline
PASS Nederland

Posts:137


13-07-2007 13:33:16 Alert 
Ruud,

mail me je xml bestand even als zip als je wilt naar andre.kamman@sqlpass.nl
Het is helaas (nog) niet mogelijk om xml als voorbeeld code in een forumpost te plaatsen.

Groeten,

André
André KammanUser is Offline
PASS Nederland

Posts:137


13-07-2007 14:41:06 Alert 

Ruud,

Je gemailde xml voorbeeld maakt het wat duidelijker.
Er wordt namelijk gebruik gemaakt van namespaces ('CONTROL:GUID' ipv 'GUID')

Die namespaces moet je eerst declareren.
Er zijn een aantal mogelijkheden, ik plaats hieronder een drietal voorbeelden die allemaal hetzelfde doen waarbij de een iets beter te lezen is dan de ander en dus 'onderhoudsvriendelijker'.
(De laatste is mijn favoriet  )

Select 
@xml
.value('declare namespace CONTROL="CONTROL"; XMIΏ]/XMI.contentΏ]/CONTROL:DiagramΏ]/CONTROL:DiagInfoΏ]/CONTROL:GUIDΏ]', 'varchar(50)') GUID,

@xml.value('declare namespace CONTROL="CONTROL"; XMIΏ]/XMI.contentΏ]/CONTROL:DiagramΏ]/CONTROL:DiagInfoΏ]/CONTROL:ParentGUIDΏ]', 'varchar(50)') ParentGuid,

@xml.value('declare namespace CONTROL="CONTROL"; XMIΏ]/XMI.contentΏ]/CONTROL:DiagramΏ]/CONTROL:DiagInfoΏ]/CONTROL:TitleΏ]', 'varchar(50)') Title

Select 
   tab
.col.value('declare namespace CONTROL="CONTROL"; CONTROL:GUIDΏ]', 'varchar(50)') GUID,
   tab.col.value('declare namespace CONTROL="CONTROL"; CONTROL:ParentGUIDΏ]', 'varchar(50)') ParentGUID,
   tab.col.value('declare namespace CONTROL="CONTROL"; CONTROL:TitleΏ]', 'varchar(50)') Title
From @xml.nodes('declare namespace CONTROL="CONTROL"; XMIΏ]/XMI.contentΏ]/CONTROL:DiagramΏ]/CONTROL:DiagInfoΏ]') as tab(col)

;With XMLNAMESPACES ('CONTROL' as CONTROL)
Select 
   tab
.col.value('CONTROL:GUIDΏ]', 'varchar(50)') GUID,
   tab.col.value('CONTROL:ParentGUIDΏ]', 'varchar(50)') ParentGUID,
   tab.col.value('CONTROL:TitleΏ]', 'varchar(50)') Title
From @xml.nodes('XMIΏ]/XMI.contentΏ]/CONTROL:DiagramΏ]/CONTROL:DiagInfoΏ]') as tab(col)


Groeten,

André

Ruud BootsUser is Offline

Posts:62

13-07-2007 18:39:57 Alert 
Andre,

Zou je mij de code kunnen mailen naar rboots@chello.nl ? Dan kan de code schoon (zonder ongewenste tekens) ontvangen.


Dank en groet
Ruud
Ruud BootsUser is Offline

Posts:62

13-07-2007 19:02:10 Alert 
Dit werkt beter, thx
Ruud
André KammanUser is Offline
PASS Nederland

Posts:137


17-07-2007 21:58:22 Alert 

Hoi Ruud,

Naar aanleiding van je mail vul ik e.e.a. nog even aan met een voorbeeld voor het ophalen van een resultset in plaats van een paar "losse" records.

;With XMLNAMESPACES ('CONTROL' as CONTROL)
Select 
   tab
.col.value('../CONTROL:ActivityΏ]/@name', 'varchar(50)') Name,
   tab.col.value('CONTROL:ObjectIDΏ]', 'varchar(50)') ObjectID
From
 @xml
.nodes('XMI/XMI.content/CONTROL:Diagram/CONTROL:DiagramElement/CONTROL:Activity') as tab(col)

Zoals je kunt zien is het de bedoeling dat je in xml.nodes het pad opgeeft, zonder "Ώ]", naar de detailrecords die je in je resultset wilt zien. Als eerste veld in de select heb ik een attribuut op een nivo hoger opgenomen als voorbeeld omdat je vaak op die manier de "primary key" van de detail records kunt meenemen.

Er zijn nogal wat voorbeelden, volgens mij zelfs in books online, die gebruik maken van een CROSS APPLY, dit is echter zoals je kunt zien niet nodig !

Groeten,

André

You are not authorized to post a reply.
Forums > Forums > XML (SIG) > syntax probleem ?



ActiveForums 3.6
  
Copyright (c) 2012 PASS Nederland   Privacy Statement  Terms Of Use