我创建了一个SSIS包,可以将Excel文件导入我的数据库。我创建了一个变量,我想将其用作Excel连接管理器的Excel文件路径。
我的SSIS包中的变量名称是“ExcelSource”,它应该代表完整路径。我想最终动态设置它,因为文件名包含日期。
运行此命令的T-SQL代码是什么?以下是我到目前为止的情况:
DECLARE @ssisstr VARCHAR(8000)
, @packagename VARCHAR(200)
, @servername VARCHAR(100)
DECLARE @params VARCHAR(8000)
--my package name
SET @packagename = 'MyPackage'
--my server name
SET @servername = 'MYCOMPUTER\MYSERVER'
SET @params = '/set \package.variables[ExcelSource].Value;"\"Y:\excelFile\Test File - June 11 2012.xlsx\""'
SET @ssisstr = 'dtexec /sq ' + @packagename + ' /ser ' + @servername + ' '
SET @ssisstr = @ssisstr + @params
DECLARE @returncode INT
EXEC @returncode = xp_cmdshell @ssisstr
SELECT @returncode
答案 0 :(得分:1)
您将遇到的问题是使用xp_cmdshell转义值。我无法解决与运行具有复杂命令行参数的包有关的其他问题。如果有人可以提供相反的信息,请告诉我,我将修改/删除我的回复。
我可以建议作为解决问题的另一种方法是让你的包确定当前文件是什么,或者使用不同的机制来指导这种行为。
这种方法是我首选的方法。您可以为您的包提供智能以解决问题。 你如何知道正确的Excel文件是什么?你说它有一个日期,所以你怎么知道那个日期是什么?
如果是今天的日期,您可以在变量上使用表达式,以所提供的格式粘贴到当前日期。
它是文件夹中的唯一文件吗?然后使用类型为file的ForEach枚举器来标识所有.xlsx文件。此问题和most excellent answer;)描述了如何使用SSIS导入最新的CSV。找到最新的Excel文件string fileMask = "*.xlsx";
如果您有描述如何确定正确文件的业务规则,我很乐意提供有关如何使用SSIS实施该规则的见解。
另一种选择是使用外部配置来提供运行时值。 SSIS提供了许多开箱即用的配置选项。我非常偏爱使用SQL Server来实现此目的,但您的选择是
最后3个是我脑海中的特殊用例,并不是特别方便你的问题,但为了完整性我已经列出了它们。无论您使用哪种配置选项,单击SSIS,打包配置,检查启用配置按钮并使用向导设置配置类型应该是一件简单的事情。
使用外部配置的第二个选项是执行您正在执行的操作,提供命令行选项来控制包行为(不需要更改包)。相反,您可以在xp_commandshell中交换一些自定义PowerShell。我认为PS只是2008 +的一个选项,但您可以编写一个相当简单的脚本来导入SSIS对象模型,创建Application实例,打开现有包,应用命令行参数并运行Application。我可以根据answer over here
中的$ app和$ package位拼凑一些东西1)您看到“选项12.0无效”的原因是由于xp_cmdshell贪婪并急切地将命令行选项中的空格解析为单独的参数。如果你开始搜索xp_cmdshell的限制,你会得到大量的命中,其中参数中的空格会导致问题。
2)尽我所能理解,SQL Agent作业是静态的。能够配置它们以调用具有变量值参数(在运行时评估的东西)的任何步骤(sql,ssis等)是非常棒的,但一般来说,我没有找到干净的方法。
3)如果您打算不更改包以确定“正确”文件是什么,使用配置或滚动您自己的调用方法(PS是SQL代理中的作业步骤类型),您可以尝试低-tech使用现有逻辑构建dtexec调用的解决方案,但将其全部放在.bat文件中。 xp_cmdshell然后调用批处理文件,该文件不应该在参数名称中处理空间。