2010-09-24 5 views
1

мне было интересно, если кто-то может помочьSQL Server 2008 - Измельчение XML в таблицах должны иметь Неизвестное значение DATE, как NULL

Я успешно был в состоянии импортировать документ XML в таблицу с типом данных XML в SQL Server2008, как всегда, когда я пытаюсь и отбрасываю эту таблицу в промежуточную таблицу, любые значения DATE без введенной даты вставляются в промежуточную таблицу как 1900-01-01.

Есть ли способ clever, который я пропускаю, чтобы остановить его, и просто вставьте NULL. Я мог бы использовать NULLIF на промежуточной таблице и заменить значение 1900-01-01 нулевым, но я не хочу делать это, если есть настоящие значения 1900-01-01.

Мой код выглядит примерно так

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

FROM import.XMLCompanyDetail 

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

Большое спасибо

Пожалуйста, смотрите ниже примере XML я импортировать

<?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> 

Дата DDIS должен быть NULL, а когда его импорт в мою промежуточную таблицу вместо этого вставляет 1901-01-01.

обновленный код, чтобы показать, что я имею в виду

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

Не могли бы вы предоставить сокращенную версию XML? –

+0

HI Martin, я добавил пример XML. Большое спасибо за то, что нашли время посмотреть. – Pixelated

ответ

1

Редактировать

После обновления на вопрос следующие работы, но я не уверен, если есть лучший способ.

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

О да ... нет, никаких триггеров на промежуточном столе. Таким образом, очевидно, что я просто делаю что-то не так где-то рядом. Но теперь с вашим кодом я могу найти то, что я делаю по-другому, и исправить. Спасибо, что нашли время, чтобы попытаться воспроизвести. Я посмотрю на свой код и обновлю свой вопрос, когда выслежу разницу. – Pixelated

+0

По-прежнему существует проблема, но по моей вине за то, что вы предоставляете неповторимый код для примеров. Я обновил код примера и продолжаю видеть, могу ли я найти решение. – Pixelated

+0

@FairFunk. Я вижу, что вы имеете в виду с обновленным кодом. Используя 'tab.col.value ('DDis [1] [.! =' '' ']', 'DATE') LastARD' работал для меня. Не уверен, есть ли лучший способ. Не стесняйтесь отвечать на мой вопрос, чтобы получить больше информации! –

1

Попробуйте использовать datetime вместо:

declare @xml xml 
set @xml = '' 

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

Подождите, это возвращает null. Это означает, что после вставки в вашу промежуточную таблицу значение null становится переопределенным по умолчанию в этой промежуточной таблице. Поэтому удалите это, если вы не хотите, чтобы это поведение происходило.

Смежные вопросы