我想每周在指定时间自动执行一次我的 SSIS 包。我想在每周加载一个新的 excel 文件的内容之前清除整个数据库。我想我可以使用截断语句来清除整个数据库。但是,如何从我不知道提前名称的文件中读取?
我的直觉告诉我,我需要知道以下几点:
How do I prompt the user for a file name in SSIS?
Am I using VB or C# to do this prompting?
谢谢!
我想每周在指定时间自动执行一次我的 SSIS 包。我想在每周加载一个新的 excel 文件的内容之前清除整个数据库。我想我可以使用截断语句来清除整个数据库。但是,如何从我不知道提前名称的文件中读取?
我的直觉告诉我,我需要知道以下几点:
How do I prompt the user for a file name in SSIS?
Am I using VB or C# to do this prompting?
谢谢!
你想要多长时间的答复?;)
在这方面你有很多选择。我列出它们是为了让我接受
我的“去”将是Foreach 枚举器并使用文件类型来处理标准文件夹中的可用文件。这会将您的问题减少为培训问题(用户,将文件拖放到 \server\share\inbound)
假设您在文件的 Connection Manager ConnectionString 属性上有一个 Expression,您可以提供此值的运行时覆盖。因此,名为 Source 的 SSIS 变量InputFile
的值是\\server\share\inbound\source_2012-07-17.txt
一个名为 Source 的连接管理器,并且在 ConnectionString 属性上有一个表达式映射到 @[User::InputFile] 当你的包运行时,只要 InputFile 的值是正确的,那么你的包就会使用正确的源文件,一切都很好。您不必创建变量并使用 expressiosn 来执行此操作,您可以直接针对连接管理器的属性执行此操作,但从维护和故障排除的角度来看,您将能够更好地解决问题。当你运行这个包时,你需要使用一个命令行选项来为你正在配置的东西提供一个明确的值。大约dtexec /file C:\mypackage.dtsx /set \Package.Variables[User::InputFile].Properties[Value];"\\server\share\inbound\source_2012-07-18.txt"
使用 dtexecui 正确构建此字符串。
如果用户实际上正在运行包(双击,执行),那么它在交互模式下运行@[System::InteractiveMode] = True
没有什么可以阻止您在脚本任务中编写完整的 Windows 窗体应用程序作为包中的第一步。也就是说,我不会用 UI 代码使 ETL 包膨胀,但可以做到。这实际上取决于您要完成的工作。
将该 UI 代码移动到专用包中。组装用户输入后,通过父/子配置将其传递给子包。
这实际上只是 2 + 3ish。做好事,让你的包基于命令行覆盖运行。这样,它就可以在交互模式下工作,也可以在服务器(SQL 代理)上执行。然后使用您希望创建用于获取和验证用户输入的接口的任何技术,然后使用这些值调用您的包。您可以跳过调用 DTEXEC,直接使用对象模型。
这应该是一千亿选项。输入文件将被命名为\\server\share\input\source_file.txt
铁腕规则,使您的用户符合您的意愿。如果你有能力,允许用户使用他们想要的任何文件名,只要它是你告诉他们使用的文件名。否则将导致他们的数据无法加载。