我想在指定时间每周自动执行一次SSIS包。我想在每周加载新excel文件的内容之前清除整个数据库。我想我可以使用truncate语句来清除整个数据库。但是,如何从一个我不知道提前名字的文件中读取?
我的直觉告诉我,我需要了解以下内容:
How do I prompt the user for a file name in SSIS?
Am I using VB or C# to do this prompting?
谢谢!
答案 0 :(得分:1)
你想要多长时间的答案? ;)
在这方面你有很多选择。我正在列出它们以便我采取
我的“转到”将是Foreach Enumerator并使用文件类型处理标准文件夹中的可用文件。这可以将您的问题减少到培训问题(用户,将文件拖放到\ server \ share \ inbound)
假设您在文件的Connection Manager ConnectionString属性上有一个Expression,您可以提供此值的运行时覆盖。因此,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窗体应用程序中运行脚本任务作为包中的第一步。也就是说, I 不会使用UI代码膨胀ETL包,但可以完成。这实际上取决于你想要完成的事情。
将该UI代码移动到专用包中。汇编用户输入后,通过父/子配置将其传递给子包。
这真的只是2 + 3ish。做好事,让你的包运行基于命令行覆盖。这样它就可以在交互模式下工作,也可以在服务器上执行(SQL Agent)。然后使用您希望创建接口的任何技术来获取和验证用户输入,然后使用这些值调用您的包。您可以跳过调用DTEXEC并直接使用对象模型。
这应该是十亿的选择。输入文件将命名为\\server\share\input\source_file.txt
用铁拳统治并让您的用户符合您的意愿。如果你有权力,允许用户使用他们希望的任何文件名,只要它是你告诉他们使用的文件名。如果不这样做,将导致数据无法加载。