【发布时间】:2016-03-05 16:03:20
【问题描述】:
有三个 SQL Server:
- 产品 (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 服务器上运行包时,数据加载不正确(即 2015 年 5 月 11 日加载为 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 服务器上的计划作业运行包时,数据加载不正确。
- 现在,有趣的事情是:当我从 NEW_TEST 服务器上的计划作业运行包但目标连接指向 NEW_PROD 服务器时,数据加载正确
- 在所有服务器上,运行 SSIS 服务的用户将默认语言设置为英国(在 sys.syslanguages 中的 langid = 23)。这同样适用于拥有计划作业的用户。
- 当我将 SSIS 包中的源数据类型定义从 DR_WSTR 更改为 DATETIME 时,无论包在何处执行,数据都会正确加载。
- 当我在源和目标之间添加数据转换,将该列从 DT_WSTR 转换为 DB DATETIME 时,数据在 NEW_PROD 上加载不正确,但在 NEW_TEST 上仍然可以正常运行。
我正在尝试弄清楚如何使用调度程序在 NEW_PROD 服务器上正确加载数据,而无需:
使用正确的排序规则重建其主数据库(不切实际 - 数据库过多,数据过多)
将所有 SSIS 包中所有日期列的源数据类型从 DT_WSTR 更改为 DATETIME(它们太多了,而且它们在其他两个服务器上工作正常)
将目标数据类型(在 DB 表中)从 DATETIME 更改为 VARCHAR(...)
所以,长话短说,我试图了解流程的哪个元素负责将源字符串解释为日期,以及如何使它使用 DMY 而不是 MDY,而不管排序规则设置是否正确。我以为我明白了,但上面列表中的第 7 项让我再次感到困惑。
任何最微弱的提示?
【问题讨论】:
-
在 SSIS 包中,对于加载这些日期的数据流目标,连接管理器是什么样的?它配置为使用什么用户?是使用 Windows 身份验证还是 SQL Server 身份验证? (我认为排序规则可能是一个红鲱鱼;我很确定只有用户语言设置会导致美国/英国日期格式混淆。)
-
SQL Server 身份验证在所有服务器上都已关闭;所有连接都是通过 AD (Windows) 登录完成的。
-
如果您查看正在执行包的 SQL Server 代理作业的日志文件(使用“查看历史记录”),并展开步骤详细信息,您是否在“以用户身份执行...”消息?
-
所有作业都在同一个服务帐户下执行。我设法让某人将该用户的区域设置从美国更改为英国,并且日期开始按预期运行。祈祷,您对用户语言设置的建议可能为我们节省了一天。
-
事后 cmets:在处理 SQL Server 2012 中的日期解释问题时,有 4 个地方需要检查: 1. db 的排序规则(最初继承自服务器排序规则) 2. SSIS 语言设置(LocaleID包级别的属性) 3. 执行包的用户的区域设置(在执行包的服务器上的操作系统级别) 4. 与执行上下文关联的数据库登录的语言设置(“默认语言”属性登录)它们之间必须有优先级,但我只是将它们都设置为相同的值,问题现在就消失了。
标签: sql-server datetime ssis sql-server-2008-r2 sql-server-2012