2009-07-29 20 views
7

¿Hay alguna manera de consultar el tipo XML de SQL Server para que un elemento con xsi:nil="true" devuelva nulo en lugar del valor predeterminado de datetime, que es 1900-01-01 00:00:00.000?Cómo convertir el valor del tipo XML de SQL Server (xsi: nil) de DateTime a nulo

aquí es un fragmento de código

declare @data xml 
set @data = 
    '<DOD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:nil="true" />' 
select Value1 = @data.value('/DOD[1]', 'datetime'), 
     Value2 = IsNull(@data.value('/DOD[1]', 'datetime'), 'NOT NULL?'), 
     Value3 = nullif(@data.value('/DOD[1]', 'datetime'), '1900-01-01') 

Valor1 & Valor2 retornos 1900-01-01 00:00:00.000. ¿Hay alguna forma de devolver un valor nulo? sin usar nullif?

+0

Preste más atención a las indicaciones de las etiquetas al hacer preguntas. Hubo 6810 preguntas en el sitio etiquetado 'sql-server' y ninguna etiquetada 'sqlserver –

+1

@Joel: Wow, excelente trabajo para convertir la etiqueta sqlserver en sql-server. Tendré más cuidado allí, la próxima vez. ~ – Sung

Respuesta

8

La fecha y hora "default" es causado por colada de una cadena vacía, que es la que da "cero" 01 jan 1900.

Así: ordenada la cadena, luego el yeso

declare @data xml 

set @data = 
     '<DOD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:nil="true" />' 

select 
    Value1 = CAST(NULLIF(@data.value('/DOD[1]', 'varchar(30)'), '') AS datetime) 
+0

Creo que su enfoque se ve mejor que lo que estaba tratando de hacer, que es ------ nullif (@ data.value ('cadena (/ DOD [1]/@xsi: nil = "true") ',' varchar (4) '),' true ') – Sung

+0

esto funcionó para mí - mi tipo de datos sql es datetime CAST (NULLIF (@ data.value ('/DOD [1] ' , 'datetime'), '') AS datetime) – 0cool

1

fácil:

declare @data xml 

set @data = 
     '<DOD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:nil="true" />' 

select 
    Value1 = @data.value('(/DOD/text())[1]', 'varchar(30)') 
+0

¡Leí en otro lugar de SO que la selección del nodo de texto() (en lugar del nodo del elemento) también mejora el rendimiento! Tenga en cuenta que seleccionar texto() devuelve NULL incluso sin xsi: nil = "true"; los elementos vacíos, incluidos aquellos con una etiqueta final explícita, también obtienen NULL. Pero ... ¿y si quisieras proporcionar una cadena vacía (de longitud cero)? Hm. – ALEXintlsos

0

también puede comprobar explícitamente nula de este modo:

declare @data xml 

set @data = '<DOD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />' 

select Value1 = @data.value('(/DOD[not(@xsi:nil eq "true")])[1]', 'datetime') 
0

Este caso podría no ser para cada uno

Una forma inteligente de hacerlo sería eliminar el nodo DOD del XML. Entonces, cualquiera que sea el nodo que quiera que sea nulo en su conjunto de resultados, simplemente elimine ese nodo cuando lo agregue al XML.

es abajo también dará lugar a un nulo:

declare @data xml 

set @data = '<Test> </Test>' 

select Value1 = @data.value('(/DOD/text())[1]', 'varchar(30)') 

Se puede ver en el ejemplo anterior que no hay ningún nodo del Departamento de Defensa por lo que resultará en un valor nulo

0

Sé que este hilo está muerto desde hace un tiempo, pero creo que de esta manera es un poco más simple:

SELECT value1 = NULLIF(@data.value('/DOD[1]', 'datetime'), '') 

el valor de cadena de la cadena XML se evalúa primero y si está vacío, se convertirá en una fecha y hora nula.

Cuestiones relacionadas