sql-server – SSIS 2012日期格式dmy vs mdy

前端之家收集整理的这篇文章主要介绍了sql-server – SSIS 2012日期格式dmy vs mdy前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有三个sql Server:

> PROD(2008 R2)
> NEW_TEST(2012)
> NEW_PROD(2012)

我正在将大量SSIS包从PROD迁移到NEW_TEST和NEW_PROD服务器.

源数据来自平面文本文件

源DATE数据的格式为dd / mm / yyyy(即2015年11月5日存储为05/11/2015).

在SSIS中,DATE源列(文本文件)的定义是Unicode字符串(DT_WSTR),目标列(在DB表中)数据类型是DATETIME,因此在从文本文件读取数据并将其写入到文本文件之间进行类型转换.数据库表.

当我在PROD(旧)服务器上运行包时,数据被正确加载.

当我在NEW_TEST服务器上运行相同(但升级到2012)的包时,数据加载也正常.

但是,当我在NEW_PROD服务器上运行包时,数据加载不正确(即05/11/2015加载为2015年5月11日而不是2015年11月5日).因此,似乎NEW_PROD服务器以某种方式使用US(MDY)设置转换UK(DMY)源日期字符串.

花了很多时间试图了解发生了什么,这就是我发现的:

> NEW_PROD服务器的排序规则设置为“sql_Latin1_General_CP1_CI_AS”
> NEW_TEST服务器具有“Latin1_General_CI_AS”的排序规则 – 这与当前的PROD服务器匹配,因此似乎NEW_PROD上的排序规则不正确.
>除上述服务器级别外,服务器级别的服务器设置之间没有其他差异.
>目标数据库在NEW_ *服务器以及当前PROD服务器上的排序规则设置为Latin1_General_CI_AS
>当我在本地计算机上手动运行程序包时,无论目标如何,数据都会正确加载.
>当我从NEW_PROD服务器上的预定作业运行包时,数据将被加载到INCORRECTLY.
>现在,一个有趣的事情:当我从NEW_TEST服务器上的预定作业运行包时,目标连接指向NEW_PROD服务器,数据加载正确
>在所有服务器上,运行SSIS服务的用户将默认语言设置为British(在sys.syslanguages中为langid = 23).这同样适用于拥有预定作业的用户.
>当我将SSIS包中的源数据类型定义从DR_WSTR更改为DATETIME时,无论程序包执行的位置如何,数据都将正确加载.
>当我在源和目标之间添加数据转换,将该列从DT_WSTR转换为DB DATETIME时,数据在NEW_PROD上加载INCORRECTLY,但仍然在NEW_TEST上运行正常.

我试图弄清楚如何使用调度程序在NEW_PROD服务器上正确加载数据,而不需要:

>使用正确的排序规则重建其主数据库(不切实际 – 数据库太多,数据太多)
>在所有SSIS包中的所有日期列上将源数据类型从DT_WSTR更改为DATETIME(它们中的太多以及它们在其他两个服务器上正常工作)
>将目标数据类型(在DB表中)从DATETIME更改为VARCHAR(…)

所以,长话短说,我试图了解该过程的哪个元素负责将源字符串解释为日期以及如何使其使用DMY而不是MDY,而不管错误的整理设置如何.我以为我得到了它,但是上面列表中的第7项让我感到困惑.

任何最微弱的暗示?

解决方法

sql Server 2012中处理日期解释问题时,有4个地方需要检查:

> db的排序规则(最初从服务器排序规则继承)
> SSIS语言设置(包级别的LocaleID属性)
>执行包的用户的区域设置(在执行包的服务器上的OS级别)
>与执行上下文关联的数据库登录的语言设置(登录的“默认语言”属性)

它们之间可能存在优先级,但我只是将它们设置为相同的值,问题现在已经消失.

原文链接:https://www.f2er.com/mssql/76812.html

猜你在找的MsSQL相关文章