2010-05-20 13 views
5

Tengo el siguiente (muy simplificado) documento XML que estoy leyendo en mi base de datos utilizando la función OPENXML:El tratamiento de los elementos vacíos como nulos en función OPENXML de SQL Server

<root> 
    <row> 
     <bar>123</bar> 
    </row> 
    <row> 
     <bar>0</bar> 
    </row> 
    <row> 
     <bar></bar> 
    </row> 
</root> 

Estoy importando en en la base de datos como por lo que:

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

el problema es que OPENXML convierte campos vacíos con el tipo de datos int a cero, por lo que este se inserta en mi mesa:

bar 
---- 
123 
0 
0 

lo que quiero insertado en mi mesa es:

bar 
---- 
123 
0 
NULL 

¿Cómo consigo la función OPENXML para tratar campos vacíos como NULL y no convertirlo en cero por defecto?

Respuesta

5

Puesto que nadie tiene alguna idea, aquí es cómo estoy "problemas" que, a pesar de que parece un truco para mí:

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

Hola Kevin, ¿Tuviste algún problema con el operador NULLIF como se menciona en mi respuesta anterior? La ventaja obvia del operador NULLIF es la mayor legibilidad y elusión de las cláusulas WHEN ... THEN. – Vaibhav

+1

FYI: si proporciona un nodo vacío, obtendrá la conversión a un valor predeterminado. Si elimina el nodo vacío obtendrá una solución NULA – Jay

2

No sabe cómo 'altamente simplificada' el código XML es, pero si tiene un atributo que especifica nulo, también puede hacer algo similar a la respuesta here; básicamente:

<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 

Este escenario ha trabajado para mí

+0

Interesante, pero por supuesto esto solo funciona si puede modificar la entrada XML. –

+0

Cierto, en mi caso, lo estaba produciendo yo mismo en otra capa de aplicación –

6

Sólo enfrentado a un problema similar y lo resolvió con la función NULLIF en SQL.

NULLIF on MSDN

estoy seguro de que habría pasado por alto, así :)

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

se deshace de la confusión creada por las declaraciones CASE... END.

Espero que ayude!

+0

Funciona bien con los tipos de caracteres, pero no con los otros tipos de datos ... – anonxen

Cuestiones relacionadas