SSIS 2016 如何将 UNC 路径加上 GETDATE() 传递给平面文件连接管理器的 ConnectionString 属性?
SSIS 2016 How to Pass UNC Path plus GETDATE() to ConnectionString Property of Flat File Connection Manager?
我正在使用 SSIS 2016 运行 来自 SQL Server 2016 的查询,并在网络共享上创建一个包含查询结果的文本文件。我不能在路径中使用驱动器盘符,因此改用 UNC 路径。我最初的方法是将表达式传递到平面文件连接管理器 ConnectionString 属性,但在部署到 Integration Services 目录后包失败并出现错误。
因此,我创建了一个参数,将连接字符串存储为以下格式的字符串:
\UNCPath\dir1\dir2\dir3(has spaces)\dir4\dir5\dir6\dir7\dir8\Filename_+ RIGHT("0" + (DT_STR, 4,
1252)DATEPART("yyyy", getdate() ),4) + RIGHT("0" + (DT_STR, 4, 1252)DATEPART("mm", getdate() ), 2)
+ RIGHT("0" +(DT_STR, 4, 1252)DATEPART("dd",getdate() ), 2) + .txt
请注意,我需要在文件名末尾以 yyyymmdd 格式包含 GETDATE()。
我尝试 运行 包裹时收到一条错误消息:
The file name property is not valid. The file name is a device or contains invalid characters.The
file name property is not valid. The file name is a device or contains invalid characters.
需要进行哪些更改才能确保我的参数传递的路径和文件名有效?
我对 SSIS 表达式语言的永远建议是让自己更轻松。
切勿直接修改对象上的表达式。没有办法调试表达式是什么,你只能猜测哪里出了问题。
相反,在包中创建大量 SSIS 变量。它们“免费”使用,是您识别任务黑匣子内容的唯一希望。
对于你的情况,我设想至少有 5 个变量。
- FileBase - 字符串 - 文件名_
- 文件扩展名 - 字符串 - .txt
- FolderBase - 字符串 - \Server\Share...\dir8\
- CurrentDate - 字符串 - 计算为表达式 = True -
RIGHT("0" + (DT_STR, 4, 1252)DATEPART("yyyy", getdate() ),4) + RIGHT("0" + (DT_STR, 4, 1252)DATEPART("mm", getdate() ), 2) + RIGHT("0" +(DT_STR, 4, 1252)DATEPART("dd",getdate() ), 2)
FileBase 只是单词“Filename_”
文件扩展名为“.txt”
FolderBase 应该与我们定义的完全一样,不需要反斜杠转义,但它必须有尾部斜杠
CurrentDate 应该看起来像 YYYYMMDD,在这篇文章中应该是 20200925
将所有这些放在一起会产生我们想要的结果,但回到规则 #1,不要在 属性 的 ConnectionString 中全部完成。相反,添加最终的 SSIS 变量
- CurrentFileName - 字符串 - 计算为表达式 = True -
@[User::FolderBase] + @[User::FileBase] + @[User::CurrentDate] + @[User::FileExtension]
现在我们做饭了!当您打开包装时,您可以看到该路径是否正确。您可以将脚本任务添加到 force the variable values to show up in the SSISDB log 包的开头(尽管 non-dynamic 部分已经存在)。
在评论中,您表示您正在使用参数。它们有点不同,因为它们是只读的,据我所知,它们不支持表达式,所以上面的公式只要稍作调整就仍然有效。
创建一个与您想要动态化的每个变量相对应的参数。即随着包从本地环境迁移到 dev 到 uat 到生产服务器,UNC 路径发生变化。
确保参数与 UNC 路径上的变量匹配 -aka 尾部斜杠。
修改变量,使 EvaluateAsExpression = True,然后将表达式与参数对齐
- FolderBase - 字符串 - 计算为表达式 = true -
@[$PackageName::FolderBase]
你唯一不能拥有的两个变量
现在一切正常并按预期工作,然后使用@[User::CurrentFileName] 驱动平面文件连接管理器。
我正在使用 SSIS 2016 运行 来自 SQL Server 2016 的查询,并在网络共享上创建一个包含查询结果的文本文件。我不能在路径中使用驱动器盘符,因此改用 UNC 路径。我最初的方法是将表达式传递到平面文件连接管理器 ConnectionString 属性,但在部署到 Integration Services 目录后包失败并出现错误。
因此,我创建了一个参数,将连接字符串存储为以下格式的字符串:
\UNCPath\dir1\dir2\dir3(has spaces)\dir4\dir5\dir6\dir7\dir8\Filename_+ RIGHT("0" + (DT_STR, 4,
1252)DATEPART("yyyy", getdate() ),4) + RIGHT("0" + (DT_STR, 4, 1252)DATEPART("mm", getdate() ), 2)
+ RIGHT("0" +(DT_STR, 4, 1252)DATEPART("dd",getdate() ), 2) + .txt
请注意,我需要在文件名末尾以 yyyymmdd 格式包含 GETDATE()。
我尝试 运行 包裹时收到一条错误消息:
The file name property is not valid. The file name is a device or contains invalid characters.The
file name property is not valid. The file name is a device or contains invalid characters.
需要进行哪些更改才能确保我的参数传递的路径和文件名有效?
我对 SSIS 表达式语言的永远建议是让自己更轻松。
切勿直接修改对象上的表达式。没有办法调试表达式是什么,你只能猜测哪里出了问题。
相反,在包中创建大量 SSIS 变量。它们“免费”使用,是您识别任务黑匣子内容的唯一希望。
对于你的情况,我设想至少有 5 个变量。
- FileBase - 字符串 - 文件名_
- 文件扩展名 - 字符串 - .txt
- FolderBase - 字符串 - \Server\Share...\dir8\
- CurrentDate - 字符串 - 计算为表达式 = True -
RIGHT("0" + (DT_STR, 4, 1252)DATEPART("yyyy", getdate() ),4) + RIGHT("0" + (DT_STR, 4, 1252)DATEPART("mm", getdate() ), 2) + RIGHT("0" +(DT_STR, 4, 1252)DATEPART("dd",getdate() ), 2)
FileBase 只是单词“Filename_”
文件扩展名为“.txt”
FolderBase 应该与我们定义的完全一样,不需要反斜杠转义,但它必须有尾部斜杠
CurrentDate 应该看起来像 YYYYMMDD,在这篇文章中应该是 20200925
将所有这些放在一起会产生我们想要的结果,但回到规则 #1,不要在 属性 的 ConnectionString 中全部完成。相反,添加最终的 SSIS 变量
- CurrentFileName - 字符串 - 计算为表达式 = True -
@[User::FolderBase] + @[User::FileBase] + @[User::CurrentDate] + @[User::FileExtension]
现在我们做饭了!当您打开包装时,您可以看到该路径是否正确。您可以将脚本任务添加到 force the variable values to show up in the SSISDB log 包的开头(尽管 non-dynamic 部分已经存在)。
在评论中,您表示您正在使用参数。它们有点不同,因为它们是只读的,据我所知,它们不支持表达式,所以上面的公式只要稍作调整就仍然有效。
创建一个与您想要动态化的每个变量相对应的参数。即随着包从本地环境迁移到 dev 到 uat 到生产服务器,UNC 路径发生变化。
确保参数与 UNC 路径上的变量匹配 -aka 尾部斜杠。
修改变量,使 EvaluateAsExpression = True,然后将表达式与参数对齐
- FolderBase - 字符串 - 计算为表达式 = true -
@[$PackageName::FolderBase]
你唯一不能拥有的两个变量
现在一切正常并按预期工作,然后使用@[User::CurrentFileName] 驱动平面文件连接管理器。