SQL Server 2008 - для разделения XML на таблицы необходимо сохранять значение UNKNOWN DATE как NULL - PullRequest
1 голос
/ 24 сентября 2010

Мне было интересно, может ли кто-нибудь помочь

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

Есть ли какой-то умный способ, который я пропускаю, чтобы остановить его, делая это и просто вставляя вместо него 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

Ответы [ 2 ]

1 голос
/ 24 сентября 2010

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

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

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)
1 голос
/ 24 сентября 2010

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

declare @xml xml
set @xml = ''

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

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

...