2010-05-20 1 views
5

Ich habe folgende (stark vereinfacht) XML-Dokument, das ich in meiner Datenbank lese so:leere Elemente wie NULL-Werte in SQL Server OpenXML Funktion Behandlung von

insert into [Foo] 
    ([bar]) 
select 
    ds.[bar] 
from openxml(@xmlHandle, 'root/row', 2) 
with ([bar] int) ds 

Das Problem ist, dass OPENXML leere Felder mit dem int-Datentyp auf Null setzt, so dass dies in meine Tabelle eingefügt wird:

bar 
---- 
123 
0 
0 

Was ich in meiner Tabelle eingefügt werden soll ist:

bar 
---- 
123 
0 
NULL 

Wie erhalte ich die OPENXML-Funktion leere Felder als NULL zu behandeln und es nicht standardmäßig auf Null konvertieren?

Antwort

5

Da niemand eine Idee hat, ist hier, wie ich es bin „Lösung“, obwohl es wie ein Hack mir scheint:

insert into [Foo] 
    ([bar]) 
select 
    isnull(ds.[bar], '') when '' then null else CAST(ds.[bar] as int) end 
from openxml(@xmlHandle, 'root/row', 2) 
with ([bar] nvarchar(20)) ds 
+0

Hallo Kevin, hatten Sie ein Problem mit dem NULLIF-Operator, wie in meiner Antwort oben erwähnt? Der offensichtliche Vorteil des NULLIF-Operators ist die verbesserte Lesbarkeit und Vermeidung der WHEN ... THEN-Klauseln. – Vaibhav

+1

FYI: Wenn Sie einen leeren Knoten bereitstellen, erhalten Sie die Konvertierung auf einen Standardwert. Wenn Sie den leeren Knoten entfernen, erhalten Sie eine NULL – Jay

2

Nicht sicher, wie ‚stark vereinfacht‘ Ihre xml ist, aber wenn Sie haben ein Attribut, das null angibt. Sie können auch etwas Ähnliches wie die Antwort here; im Grunde:

<root> 
<row> 
    <bar>123</bar> 
</row> 
<row> 
    <bar>0</bar> 
</row> 
<row> 
    <bar nil="true"></bar> 
</row> 

select ds.bar 
from openxml(@xmlHandle, 'root/row', 2) with (
    [bar] nvarchar(20) 'bar[not(@nil = "true")]' 
) ds 

Dieses Szenario hat sich für mich

arbeitete
+0

Interessante Lösung, aber das funktioniert natürlich nur, wenn Sie die XML-Eingabe ändern können. –

+0

True - in meinem Fall produzierte ich es selbst in einer anderen App-Ebene –

6

gerade ein ähnliches Problem konfrontiert und löste es mit der NULLIF Funktion in SQL.

NULLIF on MSDN

Ich bin sicher, dass Sie es auch übersehen haben würde :)

insert into [Foo] 
    ([bar]) 
select 
    NULLIF(ds.[bar], '') 
from openxml(@xmlHandle, 'root/row', 2) 
with ([bar] nvarchar(20)) ds 

Beseitigt die Unordnung durch die Aussagen CASE... END erstellt.

Hoffe es hilft!

+0

Funktioniert gut mit den Char-Typen, aber nicht mit den anderen Datentypen ... – anonxen

Verwandte Themen