2009-07-29 16 views
7

Esiste un modo per interrogare il tipo XML di SQL Server in modo che per un elemento con xsi:nil="true", restituisca null invece del valore di data/ora predefinito, ovvero 1900-01-01 00:00:00.000?Come convertire il valore del tipo XML di SQL Server (xsi: nil) di DateTime su null

: ecco un frammento di codice

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') 

Value1 & Valore2 entrambi i rendimenti 1900-01-01 00:00:00.000. C'è un modo per restituire un null, invece? senza usare nullif?

+0

Si prega di prestare maggiore attenzione ai suggerimenti dei tag quando si fanno domande. Ci sono state 6810 domande sul sito taggato "sql-server" e nessuna codificata "sqlserver –

+1

@Joel: Wow, ottimo lavoro di conversione del tag sqlserver in sql-server. Sarò più attento lì, la prossima volta. ~ – Sung

risposta

8

Il datetime "default" è causato da colata una stringa vuota che è "zero", che dà 1 gennaio 1900.

Quindi: ordinata la corda, poi gettato

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

Penso che il tuo approccio sia migliore di quello che stavo cercando di fare, che è ------ nullif (@ data.value ('string (/ DOD [1]/@xsi: nil = "true") "," varchar (4) ")," true ") – Sung

+0

ha funzionato per me - il mio tipo di dati sql è datetime CAST (NULLIF (@ data.value ('/ DOD [1]' , 'datetime'), '') AS datetime) – 0cool

1

facile:

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

Ho letto altrove su SO che la selezione del nodo text() invece del nodo elemento migliora anche le prestazioni! Nota che selezionare text() restituisce NULL anche senza xsi: nil = "true"; anche gli elementi vuoti inclusi quelli con un tag di chiusura esplicito ottengono NULL. Ma ... e se volessi fornire una stringa vuota (a lunghezza zero)? Hm. – ALEXintlsos

0

puoi anche esplicitamente verificare la presenza di zero in questo 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

Questo caso potrebbe non essere per tutti

Un modo intelligente per farlo sarebbe quello di rimuovere il nodo DOD dall'XML. Quindi, quale nodo mai vuoi essere nullo nel tuo set di risultati rimuovi quel nodo quando lo aggiungi all'XML.

così sotto anche comportare una nullo:

declare @data xml 

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

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

Può essere visto nell'esempio precedente che non v'è alcun nodo DOD quindi il risultato sarà un valore nullo

0

So questa discussione è morto da un po ', ma credo che in questo modo è un po' più semplice:

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

il valore di stringa dalla stringa XML viene valutata prima e se è vuoto, diventerà un datetime nullo.

Problemi correlati