2010-09-24 2 views
1

Je me demandais si quelqu'un pouvait aiderSQL Server 2008 - Déchiquetage XML aux tables doivent conserver la valeur DATE INCONNUE NULL

Je suis en mesure d'importer avec succès un document XML à une table avec un type de données XML SQL Server2008, mais quand j'essaye de déchiqueter de cette table à une table intermédiaire toutes les valeurs de DATE sans une date entrée sont insérées à la table intermédiaire comme 1900-01-01.

Y at-il un moyen de couper le cleaver qui me manque pour l'empêcher de faire cela et d'insérer simplement la valeur NULL à la place. Je pourrais utiliser NULLIF sur la table de transfert et remplacer 1900-01-01 par null mais je suis réticent à le faire en cas de valeurs 1900-01-01 réelles.

Mon code ressemble à ce

SELECT tab.col.value('LastDate[1]','DATE') LastARD' 

FROM import.XMLCompanyDetail 

CROSS APPLY 
      xmldata.nodes('//VN/CompanyList/Row') AS tab(col) 

Un grand merci

S'il vous plaît voir ci-dessous le code XML exemple que je importe

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<VN> 
<CompanyList> 
<Row num="1"><CoNum>7878</CoNum><CoName>ExampleName</CoName><DInc>1978-12-30</DInc><DDis></DDis></Row> 
</CompanyList> 
</VN> 

La date DDIS devrait être NULL, mais plutôt quand il importe à ma table de transfert, elle insère 1901-01-01 à la place.

code mis à jour pour montrer ce que je veux dire

create table staging_table 
(DInc DATE NULL, LastARD DATE NULL); 

with XMLCompanyDetail as 
(
SELECT CAST('<?xml version="1.0" encoding="ISO-8859-1" ?> 
<VN> 
<CompanyList> 
<Row num="1"><CoNum>7878</CoNum><CoName>ExampleName</CoName><DInc>1978-12-30</DInc><DDis></DDis></Row> 
</CompanyList> 
</VN> 
' AS XML) AS xmldata 
) 

INSERT INTO Staging_Table 
SELECT tab.col.value('DInc[1]','DATE') DInc, 
tab.col.value('DDis[1]','DATE') LastARD 
FROM XMLCompanyDetail 
CROSS APPLY 
xmldata.nodes('//VN/CompanyList/Row') AS tab(col) 

SELECT * FROM Staging_table 
drop table staging_table 
+0

Pourriez-vous également fournir une version réduite du code XML? –

+0

HI Martin, j'ai ajouté l'exemple XML. Merci beaucoup d'avoir pris le temps de jeter un coup d'œil. – Pixelated

Répondre

1

Modifier

Après mise à jour à la question Les travaux suivants, mais je ne sais pas s'il y a une meilleure façon.

SELECT tab.col.value('DInc[1][. != '''']','DATE') DInc, 
tab.col.value('DDis[1][. != '''']','DATE') LastARD 
FROM XMLCompanyDetail 
CROSS APPLY 
xmldata.nodes('//VN/CompanyList/Row') AS tab(col) 
+0

Oh oui ... non, pas de déclencheurs sur la table de mise en scène. Donc c'est évidemment juste que je fais quelque chose de mal quelque part le long des lignes. Mais maintenant, avec votre code, je peux trouver ce que je fais différemment et réparer. Merci d'avoir pris le temps d'essayer de reproduire. Je jetterai un coup d'oeil à mon code et mettrai à jour ma question quand je repèrerai la différence. – Pixelated

+0

Il y a toujours un problème mais c'est ma faute pour fournir un code inconstant pour les exemples. J'ai mis à jour le code d'exemple et je continuerai à voir si je peux trouver une solution. – Pixelated

+0

@FairFunk. Je vois ce que vous voulez dire avec le code mis à jour. En utilisant 'tab.col.value ('DDis [1] [.! =' '' ']', 'DATE') Lastard' a fonctionné pour moi. Je ne sais pas s'il y a un meilleur moyen cependant. N'hésitez pas à ne pas accepter ma réponse pour obtenir plus d'informations! –

1

Essayez d'utiliser à la place datetime:

declare @xml xml 
set @xml = '' 

select @xml.value('LastDate[1]','datetime') 

Attendez, cela renvoie null. Cela signifie que lors de l'insertion dans votre table de transfert, cette valeur null est remplacée par le paramètre par défaut de cette table de transfert. Supprimez donc cela si vous ne voulez pas que ce comportement se produise.

Questions connexes