2009-07-29 8 views
7

Existe-t-il un moyen d'interroger le type SQL Server XML de sorte que pour un élément avec xsi:nil="true", renvoie null au lieu de valeur par défaut datetime, 1900-01-01 00:00:00.000?Comment faire pour convertir la valeur de type XML SQL Server (xsi: nil) de DateTime en null

est ici un extrait de code

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

Valeur1 Valeur2 & les retours 1900-01-01 00:00:00.000. Existe-t-il un moyen de renvoyer un null, à la place? sans utiliser nullif?

+0

Veuillez prêter plus d'attention aux invites d'étiquette lorsque vous posez des questions. Il y avait 6810 questions sur le site étiqueté 'sql-server' et aucun tagged 'sqlserver –

+1

@Joel: Wow, super travail de conversion sqlserver tag à sql-server. Je ferai plus attention là-bas, la prochaine fois. ~ – Sung

Répondre

8

Le datetime "par défaut" est causée par coulée d'une chaîne vide qui est "zéro", qui donne le 1 janvier 1900.

donc: bien rangé la chaîne, puis CAST

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

Je pense que votre approche semble mieux que ce que j'essayais de faire, qui est ------ nullif (@ data.value ('string (/ DOD [1]/@xsi: nil = "true") ',' varchar (4) '),' true ') – Sung

+0

cela a fonctionné pour moi - mon type de données sql est 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

J'ai lu ailleurs sur SO que la sélection du noeud text() (au lieu du noeud element) améliore également les performances! Notez que la sélection de text() renvoie NULL même sans xsi: nil = "true"; Les éléments vides, y compris ceux avec une balise de fin explicite, sont également NULL. Mais ... et si vous vouliez fournir une chaîne vide (de longueur nulle)? Hm. – ALEXintlsos

0

Vous pouvez également vérifier explicitement nul comme ceci:

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

Une façon intelligente de procéder serait de supprimer le noeud DOD du fichier XML. Donc, quel que soit le nœud que vous voulez être nul dans votre jeu de résultats, supprimez ce nœud en l'ajoutant au XML.

So Below se traduira également par une valeur nulle:

declare @data xml 

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

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

On peut voir dans l'exemple ci-dessus qu'il n'y a pas de noeud DOD donc il en résultera une valeur nulle

0

Je sais ce fil est mort depuis un certain temps, mais je pense que cette façon est un peu plus simple:

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

la valeur de chaîne de la chaîne xml est évaluée en premier et si elle est vide, deviendra un datetime nul.

Questions connexes