从XML

时间:2016-04-21 05:46:46

标签: sql-server xml date datetime

我有一个XML数据,其中Date格式会随时更改 yyyy-dd-MM(T)HH:mm:ss 有一段时间它来自 yyyy-MM-dd(T)HH:mm:ss

在解析XML时,我不确定如何处理这种情况,因为我的SQL Server默认语言是 Us_english

如果我在SQL SERVER中使用BEGIN TRY AND CATCH语句并且在解析数据时发生错误,PROC的执行将停止。

代码示例

BEGIN TRY
Select Cast(Replace(C.H.value('SameDateColumn[1]','nvarchar(20)'),'T',' ')   as Datetime) as 'DateHistory'
from @XMLIN.nodes('//HeaderT') C(H);
set language Us_english
END TRY
BEGIN CATCH
set language british
END CATCH

有没有办法,所以如果发生异常,我可以将默认语言设置为 british ,并在SQL SERVER中的END CATCH语句之后执行代码。

我也试过使用ISDATE()方法,但每次它都给我1作为输出,无论 us_english 格式还是英国

1 个答案:

答案 0 :(得分:0)

正如我的评论所指出的,我认为存在一种误解......

我认为,不同的格式并非来自XML 中的错误数据,但它们是您尝试转换不同系统中内容的结果......

你读这样的日期:

Select Cast(Replace(C.H.value('SameDateColumn[1]','nvarchar(20)'),'T',' ')   as Datetime) as 'DateHistory'
from @XMLIN.nodes('//HeaderT') C(H);

这意味着:您从XML中的 中读取日期作为文本(nvarchar(20)。现在替换“T”,然后将此字符串转换为DateTime最后一步取决于你的系统文化和使用的语言。它甚至取决于用户的登录!。

如果一切正常, XML中的日期应为ISO8601,如下所示:

2016-04-21T15:21:00

尝试阅读这样的日期:

Select C.H.value('SameDateColumn[1]','datetime') as 'DateHistory'
from @XMLIN.nodes('//HeaderT') C(H);

如果XML是正确创建的,那么这应该有效,根本不需要转换。