【问题标题】:Convert Date To String in SSIS with current name of month?使用当前月份名称将 SSIS 中的日期转换为字符串?
【发布时间】:2019-07-13 21:07:12
【问题描述】:

我得到了错误,

将数据类型 varchar 转换为日期时出错。

从这个表达式

(DT_STR,30,1252)@[User::ToDate]

DO NET 源 [40]:执行提供的 SQL 命令时发生错误:“EXEC [dbo.StoredProcedure] @ToDate = '01-maj-2018'

错误:导入时出现 0xC004706B(请参阅表达式!),SSIS.Pipeline:“ADO NET 源”验证失败并返回验证状态“VS_ISBROKEN”。

@ToDate = '01-maj-2018'

如何更改它,使我的 @ToDate 将是 01-may-2018 而不是 01-maj-2018

我尝试搜索并且有很多类似的问题,但没有一个关于此特定错误的问题。为什么它甚至让我的字符串有maj

【问题讨论】:

  • 你如何将值传递给@ToDate 参数?
  • @[User::YYY] = EXEC dbo.XXX @ToDate = '"+ (DT_STR, 30,1252)@[User::ToDate] 其中@[User::ToDate] 设置为5 月 1 日
  • 复制步骤。 1.将您的Windows设置为某种本地语言。 2. 添加 DateTime 变量 ForCollat​​ionTest 并将值设置为 2019 年 5 月 1 日 3. 添加另一个变量 (DT_WSTR, 30) (@[User::ForCollat​​ionTest]),结果将以本地语言显示
  • 存储过程中的日期参数是什么数据类型?如果所有变量都是日期,那么您永远不会遇到此问题,并且您永远不必担心转换为特定格式。换句话说,确保 SP 参数的类型为 date,并确保 SSIS 变量的类型也为 date。如果您只使用不关心格式的数据类型(即日期而不是字符串),则区域设置应该是无关紧要的
  • 我生成像 Exec dbo.XXXX @x1 = '15 maj 2019' 这样的 SQL 并且这个 Exec 失败

标签: datetime ssis expression etl polish


【解决方案1】:

我同意@AlexanderVolok,看起来包的 LocalID 与英语不同,或者在操作系统区域设置中选择的日期时间文化信息不同。

(1) 使用条件更改月份名称? :

如果您可以更改这些属性,那么它可能会解决问题,否则您可以在数据流任务之前添加一个 表达式任务,该任务使用条件运算符 @987654325 将日期转换为具有不同格式的字符串@,例如 (假设您正在处理波兰语月份名称)

@[User::NewDataString] = 
LEFT((DT_WSTR,50)@[User::ToDate],2) + "-" +
(SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "maj" ? "may" : 
SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "stycz" ? "Jan" : 
SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "lut" ? "feb" : 
SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "mar" ? "mar" : 
SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "maj" ? "may" : 
SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "czerw" ? "jun" : 
SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "lip" ? "jul" : 
SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "sierp" ? "aug" : 
SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "wrzes" ? "sep" : 
SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "pazdzier" ? "oct" : 
SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "listopad" ? "nov" : "dec" )
+ "-" + RIGHT((DT_WSTR,50)@[User::ToDate],4)

那么你应该将新变量作为参数传递。

(2) 更改数据格式为 yyyy-MM-dd

您还可以使用表达式任务,将月份转换为数值,例如:

@[User::NewDateString] = 
RIGHT((DT_WSTR,50)@[User::ToDate],4) + "-" +
RIGHT("0" + (DT_WSTR,50)DATEPART("mm", @[User::ToDate]),2) + "-" + 
LEFT((DT_WSTR,50)@[User::ToDate],2)

参考文献

【讨论】:

  • 这是正确的答案,因为它有效。至少对于我的设置而言。
【解决方案2】:

您的包裹的 LocaleID 似乎不同于 1033(英语-美国)。

这个值可以在包级别进行调整,所以所有底层任务都会继承它。

如果值是在 SQL Server 端生成的,也可以与 SQL Server 登录的语言设置相关

检查什么会影响 SSIS 中的日期区域设置的相关问题:SSIS 2012 date formats dmy vs mdy

【讨论】:

    【解决方案3】:

    不确切知道错误,但我认为这可能是由于 SQL Server 排序规则,请尝试检查您的服务器排序规则。或者可能正在探索排序规则可能会对您有所帮助。

    Collations

    【讨论】:

    • 试图将包的语言环境更改为英语,但仍然得到“maj”。
    • 你的服务器排序规则是什么。
    • SQL_Latin1_General_CP1_CI_AS
    猜你喜欢
    • 2020-11-16
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 2017-02-07
    相关资源
    最近更新 更多