SSIS 派生列 - 如何将子字符串转换为日期?
SSIS Derived Column - How to convert substring to date?
我正在使用 SSIS 派生列转换。该字段的源是保存在平面文件源中的文件名。完全限定的 UNC 路径是
\v201.os33cust.net\TKFMC\groups\Managed Care Operations\Health Plan Specific Data\Self-Funded\MedImpact\Accumulator\Download\Reload\type28_phi01_ais_02032021_02032021_001.txt
由于文件名是UNC路径,我只需要yyyy-mm-dd格式的日期部分,我在派生列转换中写了以下表达式:
(DT_DBDATE)(SUBSTRING(Filename,155,4) + "-" + SUBSTRING(Filename,151,2) + "-" + SUBSTRING(Filename,153,2))
几天前初步处理成功。今天,抛出一个错误:
An error occurred while attempting to perform a type cast.
上述表达式的目标字段在 SQL Server 2016 中,使用日期字段类型。日期格式为 yyyy-mm-dd 的原因是因为当我生成需要这种格式的平面文件时,下游需要格式。
由于几天前该过程成功,并且环境、table 等方面没有任何变化,我很想知道如何最好地解决这个问题?
UNC
\v201.os33cust.net\TKFMC\groups\Managed Care Operations\Health Plan Specific Data\Self-Funded\MedImpact\Accumulator\Download\Reload\type28_phi01_ais_02032021_02032021_001.txt
在处理 UNC 路径时依赖 SUBSTRING()
函数是非常危险的,因为它们会波动。
SSIS 为您的场景提供了更好的功能:
TOKEN()
TOKENCOUNT()
在下面的例子中,TOKEN
函数returns指定路径的文件名:
TOKEN(@[User::fileNameUNC], "\", TOKENCOUNT(@[User::fileNameUNC], "\"))
所以此时你将有type28_phi01_ais_02032021_02032021_001.txt。
您需要重复相同的方法,同时使用下划线字符对其进行标记化。文件名包含 6 个标记。看来你需要一个令牌 #4.
TOKEN(TOKEN(@[User::fileNameUNC], "\", TOKENCOUNT(@[User::fileNameUNC], "\")), "_", 4)
所以此时你将有 02032021。
然后使用 SUBSTRING()
函数编写日期。
这是你的完整表达:
SUBSTRING(TOKEN(TOKEN(@[User::fileNameUNC], "\", TOKENCOUNT(@[User::fileNameUNC], "\")), "_", 4), 5,4)
+ "-" +
SUBSTRING(TOKEN(TOKEN(@[User::fileNameUNC], "\", TOKENCOUNT(@[User::fileNameUNC], "\")), "_", 4), 1,2)
+ "-" +
SUBSTRING(TOKEN(TOKEN(@[User::fileNameUNC], "\", TOKENCOUNT(@[User::fileNameUNC], "\")), "_", 4), 3,2)
对比:
我正在使用 SSIS 派生列转换。该字段的源是保存在平面文件源中的文件名。完全限定的 UNC 路径是
\v201.os33cust.net\TKFMC\groups\Managed Care Operations\Health Plan Specific Data\Self-Funded\MedImpact\Accumulator\Download\Reload\type28_phi01_ais_02032021_02032021_001.txt
由于文件名是UNC路径,我只需要yyyy-mm-dd格式的日期部分,我在派生列转换中写了以下表达式:
(DT_DBDATE)(SUBSTRING(Filename,155,4) + "-" + SUBSTRING(Filename,151,2) + "-" + SUBSTRING(Filename,153,2))
几天前初步处理成功。今天,抛出一个错误:
An error occurred while attempting to perform a type cast.
上述表达式的目标字段在 SQL Server 2016 中,使用日期字段类型。日期格式为 yyyy-mm-dd 的原因是因为当我生成需要这种格式的平面文件时,下游需要格式。
由于几天前该过程成功,并且环境、table 等方面没有任何变化,我很想知道如何最好地解决这个问题?
UNC
\v201.os33cust.net\TKFMC\groups\Managed Care Operations\Health Plan Specific Data\Self-Funded\MedImpact\Accumulator\Download\Reload\type28_phi01_ais_02032021_02032021_001.txt
在处理 UNC 路径时依赖 SUBSTRING()
函数是非常危险的,因为它们会波动。
SSIS 为您的场景提供了更好的功能:
TOKEN()
TOKENCOUNT()
在下面的例子中,TOKEN
函数returns指定路径的文件名:
TOKEN(@[User::fileNameUNC], "\", TOKENCOUNT(@[User::fileNameUNC], "\"))
所以此时你将有type28_phi01_ais_02032021_02032021_001.txt。
您需要重复相同的方法,同时使用下划线字符对其进行标记化。文件名包含 6 个标记。看来你需要一个令牌 #4.
TOKEN(TOKEN(@[User::fileNameUNC], "\", TOKENCOUNT(@[User::fileNameUNC], "\")), "_", 4)
所以此时你将有 02032021。
然后使用 SUBSTRING()
函数编写日期。
这是你的完整表达:
SUBSTRING(TOKEN(TOKEN(@[User::fileNameUNC], "\", TOKENCOUNT(@[User::fileNameUNC], "\")), "_", 4), 5,4)
+ "-" +
SUBSTRING(TOKEN(TOKEN(@[User::fileNameUNC], "\", TOKENCOUNT(@[User::fileNameUNC], "\")), "_", 4), 1,2)
+ "-" +
SUBSTRING(TOKEN(TOKEN(@[User::fileNameUNC], "\", TOKENCOUNT(@[User::fileNameUNC], "\")), "_", 4), 3,2)
对比: