Avatar billede ennos Nybegynder
25. maj 2004 - 12:46 Der er 14 kommentarer og
1 løsning

Import af wellformed XML

Hej!

Jeg sidder i øjeblikket i forbindelse med en skoleopgave og prøver på at få importeret et welformed xml-dokument importeret i MS SQL. Der, hvor jeg er nået til, får jeg imidlertid fejlmeldingen 'Server: Msg 208, Level 16, State 1, Line 21
Invalid object name 'leverandoerID'.'

Nogen, der har en løsning?

Min storedprocedure er indtil videre:

DECLARE @hdoc int
DECLARE @doc varchar (1000)
Set @doc='
<ROOT>

<leverandoerID>1010</leverandoerID>

<produkt type="ny" leverandoerVareNr="9999">
        <prisumoms="100" prismmoms="125"
        vareType="Kanelstang" vareUnderType="30 pund"
        beskrivelse="Masser af kanel og sukker">
</produkt>

</ROOT>'

EXEC sp_xml_preparedocument @hdoc OUTPUT

-- OPENXML benyttes til at indsætte en række af hhv. katalog og varedata i den relationelle database.

INSERT leverandoerID
Select leverandoerID
FROM OPENXML (@hdoc, N'/ROOT/leverandoerID')
    WITH katalog

INSERT produkt
Select leverandoerVareNr, prisumoms, prismmoms
FROM OPENXML (@hdoc, N'/ROOT/produkt')
    WITH katalog

INSERT produkt
Select vareType, vareUnderType, beskrivelse
FROM OPENXML (@hdoc, N'/ROOT/produkt')
    WITH vare

-- Fjernelse af den interne præsentation af XML-dokumentet

EXEC sp_xml_removedocument katalog
Avatar billede venne Nybegynder
25. maj 2004 - 12:58 #1
Måske er det fordi du skriver:

  INSERT leverandoerID
  ...

Jeg gætter på at du ikke har en tabel der hedder leverandoerID.
Avatar billede ennos Nybegynder
25. maj 2004 - 13:09 #2
Det er helt korrekt - tabellen, som leverandoerID skal importeres i, hedder 'katalog'.

Men skriver jeg i stedet INSERT katalog får jeg meldingen:

Server: Msg 213, Level 16, State 4, Line 21
Insert Error: Column name or number of supplied values does not match table definition.
Avatar billede ennos Nybegynder
25. maj 2004 - 13:17 #3
Jeg kan sådan set godt forstå, hvad meldingen går på, eftersom katalog gerne skal importere attributterne leverandoerID, leverandoerVareNr, prisumoms og prismmoms. Jeg har imidlertid behov for, at der kan eksistere mange hhv. leverandoerVareNr, prisumoms og prismmoms for hvert leverandoerID - derfor er XML'en designet, som den er.
Avatar billede venne Nybegynder
25. maj 2004 - 14:19 #4
Skal du ikke skrive:

  EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc

Hvis ikke @doc er med får du et tomt datasæt.
Avatar billede ennos Nybegynder
02. juni 2004 - 10:10 #5
Ifølge books online, så jo.

Har forsøgt at lave et andet mere simpelt eksempel, hvor jeg kun forsøger at importere informationer til en enkelt tabel. Problemet er imidlertid, at så længe jeg ikke tager @doc delen med returnerer proceduren fint et tomt datasæt.

Når jeg tilføjer @doc, får jeg imidlertid fejlmeldingen:

Server: Msg 6603, Level 16, State 1, Procedure sp_xml_preparedocument, Line 11
XML parsing error: An Invalid character was found in text content.

Det nye eksempel, jeg arbejder med er som følger:

DECLARE @hdoc int
DECLARE @doc varchar (1000)
Set @doc='
<ROOT>

<vare vareNr="12222" vareType="Stor hammer" vareUnderType="Meget Stor Hammer" beskrivelse="Slår meget hårdt">
</vare>

</ROOT>'

EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc

Select *
FROM OPENXML (@hdoc, '/ROOT/vare')
    WITH vare

EXEC sp_xml_removedocument @hdoc
Avatar billede venne Nybegynder
02. juni 2004 - 10:42 #6
Det er nok fordi danske tegn ikke accepteres uden videre.
Prøv at indsætte denne linie i toppen af dokumentet, altså før <ROOT>:

<?xml version="1.0" encoding="iso-8859-1" ?>
Avatar billede ennos Nybegynder
02. juni 2004 - 11:21 #7
Mener du efter: Set @doc='?

Har forsøgt mange placeringer, men får enten meldingen, at syntaksen er forkert eller: Server: Msg 6603, Level 16, State 1, Procedure sp_xml_preparedocument, Line 12
XML parsing error: The following tags were not closed: ROOT.

Har også forsøgt at ændre de danske tegn, men får så fortsat meldingen om 'invalid character'.
Avatar billede venne Nybegynder
02. juni 2004 - 11:58 #8
Dette virker hos mig (bemærk at jeg har ændret WITH-delen da jeg ikke har din tabel):

DECLARE @hdoc int
DECLARE @doc varchar (1000)
Set @doc='
<?xml version="1.0" encoding="iso-8859-1" ?>
<ROOT>

<vare vareNr="12222" vareType="Stor hammer" vareUnderType="Meget Stor Hammer" beskrivelse="Slår meget hårdt">
</vare>

</ROOT>'

EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc

Select *
FROM OPENXML (@hdoc, '/ROOT/vare')
  WITH (
    vareNr int,
    vareType varchar(50),
    vareUnderType varchar(50),
    beskrivelse varchar(50)
  )

EXEC sp_xml_removedocument @hdoc
Avatar billede ennos Nybegynder
02. juni 2004 - 14:03 #9
Underligt... nu virker det også hos mig... selv det eksempel, som jeg selv gav lige i forrige kommentar, så længe jeg bare ændrer de danske tegn. Jeg må have begået en eller anden fejl før... har dog endnu ikke fundet ud af hvad.

Men mange, mange tak for hjælpen. Nu kan jeg gå videre med at udvide importstatementen. Hvis du lige kaster et svar, så vil jeg med største fornøjelse give dig pointsene. :o)
Avatar billede venne Nybegynder
02. juni 2004 - 14:15 #10
Selv tak - jeg havde aldrig prøvet OPENXmL før, så jeg lærte også noget... Books Online er guld...
Avatar billede ennos Nybegynder
02. juni 2004 - 14:18 #11
Hehe... det er det i hvert fald, men den kræver en hel del indsigt. Når man sidder som fuldstændigt nybegynder står man tit og mangler forklaring på eksemplerne.
Avatar billede ennos Nybegynder
03. juni 2004 - 02:18 #12
Ved du for resten, om det kan lade sig gøre at foretage opdates af enkelte kolonner i en eksisterende tuppel via OPENXML? Ifølge Books Online kan det, men de giver intet eksempel på syntaksen.
Avatar billede ennos Nybegynder
03. juni 2004 - 04:00 #13
Er nået frem til følgende, men datasættet er tomt - 'O rows was affected':

DECLARE @hdoc int
DECLARE @doc varchar (1000)
Set @doc='
<?xml version="1.0" encoding="iso-8859-1" ?>
<ROOT>

<vare vareNr="12223" vareType="Lille fin hammer" vareUnderType="Meget lille fin Hammer" beskrivelse="Slår utroligt hårdt">
</vare>

</ROOT>'

EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc

UPDATE vare
SET     vare.vareType = N'/ROOT/vare/vareType',
    vare.vareUnderType = N'/ROOT/vare/vareUnderType'
FROM OPENXML (@hdoc, N'/ROOT/vare')
WITH vare
WHERE vare.vareNr =  N'/ROOT/vare/vareNr'

EXEC sp_xml_removedocument @hdoc
Avatar billede venne Nybegynder
03. juni 2004 - 09:26 #14
Fuldstændigt utestet:

UPDATE vare
SET vare.vareType = xmlvare.varetype,
    vare.vareUnderType = xmlvare.vareUnderType
FROM OPENXML (@hdoc, N'/ROOT/vare')
    WITH vare xmlvare
WHERE vare.vareNr =  xmlvare.varenr
Avatar billede ennos Nybegynder
03. juni 2004 - 10:30 #15
Respekt! :o)

Så godt, at Books Online viser det på den måde et sted, men jeg troede, at xml foran var alt for generelt til, at OpenXML kunne finde ud af at finde det. Man lærer noget nyt hele tiden.

Mange tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester