SSIS 2012 日期格式 dmy 与 mdy
SSIS 2012 date formats dmy vs mdy
有三个 SQL 服务器:
- 产品 (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中table)数据类型是DATETIME所以类型转换发生在从文本文件读取数据并将其写入数据库 table.
之间
当我 运行 PROD(旧)服务器上的包时,数据被正确加载。
当我 运行 NEW_TEST 服务器上的相同(但升级到 2012)包时,数据加载也正常。
然而,当我 运行 NEW_PROD 服务器上的包时,数据加载不正确(即 05/11/2015 加载为 2015 年 5 月 11 日而不是预期的 2015 年 11 月 5 日).因此,NEW_PROD 服务器似乎使用美国 (MDY) 设置以某种方式转换了英国 (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(它们太多而且它们在其他两个服务器上工作正常)
将目标数据类型(在数据库 table 中)从 DATETIME 更改为 VARCHAR(...)
因此,长话短说,我试图了解流程的哪个元素负责将源字符串解释为日期,以及如何使其使用 DMY 而不是 MDY 而不管排序规则设置不正确。我以为我明白了,但上面列表中的第 7 项又让我感到困惑。
有什么最微弱的提示吗?
在 SQL Server 2012 中处理日期解释问题时,有 4 个地方需要检查:
数据库的排序规则(最初继承自服务器排序规则)
SSIS语言设置(包级别的LocaleID 属性)
执行包的用户的区域设置(在执行包的服务器上 OS 级别)
与执行上下文关联的数据库登录的语言设置(登录的"Default language"属性)
它们之间可能有优先级,但我只是将它们都设置为相同的值,现在问题消失了。
有三个 SQL 服务器:
- 产品 (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中table)数据类型是DATETIME所以类型转换发生在从文本文件读取数据并将其写入数据库 table.
之间当我 运行 PROD(旧)服务器上的包时,数据被正确加载。
当我 运行 NEW_TEST 服务器上的相同(但升级到 2012)包时,数据加载也正常。
然而,当我 运行 NEW_PROD 服务器上的包时,数据加载不正确(即 05/11/2015 加载为 2015 年 5 月 11 日而不是预期的 2015 年 11 月 5 日).因此,NEW_PROD 服务器似乎使用美国 (MDY) 设置以某种方式转换了英国 (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(它们太多而且它们在其他两个服务器上工作正常)
将目标数据类型(在数据库 table 中)从 DATETIME 更改为 VARCHAR(...)
因此,长话短说,我试图了解流程的哪个元素负责将源字符串解释为日期,以及如何使其使用 DMY 而不是 MDY 而不管排序规则设置不正确。我以为我明白了,但上面列表中的第 7 项又让我感到困惑。
有什么最微弱的提示吗?
在 SQL Server 2012 中处理日期解释问题时,有 4 个地方需要检查:
数据库的排序规则(最初继承自服务器排序规则)
SSIS语言设置(包级别的LocaleID 属性)
执行包的用户的区域设置(在执行包的服务器上 OS 级别)
与执行上下文关联的数据库登录的语言设置(登录的"Default language"属性)
它们之间可能有优先级,但我只是将它们都设置为相同的值,现在问题消失了。