我正在忙于设置一个SSIS包,它接受一个平面文件并将其内容加载到一个临时表中。从那里它需要获取该文件的文件名并将其保存到另一个表的字段中,以及其中一行数据。通过使用执行存储过程的执行SQL任务来加载数据。此过程将文件名作为输入参数(只是这样我可以将其写入该表)...我在执行以下操作的执行SQL任务之前添加了一个脚本任务:
public void Main()
{
string inputFolder;
string fileName;
inputFolder = Dts.Variables["SourceFolder"].Value.ToString();
// MessageBox.Show(inputFolder);
string[] foundFiles = null;
foundFiles = System.IO.Directory.GetFiles(inputFolder);
if (foundFiles.Length > 0)
{
fileName = foundFiles[0];
Dts.Variables["ProcessedFileName"].Value = System.IO.Path.GetFileName(fileName);
// MessageBox.Show(fileName);
// MessageBox.Show(System.IO.Path.GetFileName(fileName));
}
Dts.TaskResult = (int)ScriptResults.Success;
}
“ProcessedFileName”变量是SSIS包中的全局变量,以及“SourceFolder”变量。
我使用直接输入执行设置的执行SQL任务:
DECLARE @StoredProcedure varchar(100) = ?;
DECLARE @ProcessedFileName varchar(100) = ?;
EXEC ? ?;
参数映射是变量StoredProcedure和ProcessedFileName。
问题是,当我运行它时,它告诉我“没有给出一个或多个必需参数的值。”为什么会这样?
答案 0 :(得分:1)
您无法使用参数在“执行SQL任务”中动态更改存储过程名称。这就是EXEC ? ?;
正在做的事情。
如果您需要在运行时更改过程名称,则需要通过表达式使用字符串连接来构建我们的查询。
更大的图片,似乎您正在使用一个For Each (file) Enumerator任务就足够的脚本任务。有理由使用脚本任务而不是foreach(比如你需要按顺序处理等),但它不像你那样读。
可能对如何完成表达式和foreach枚举器有帮助的各种答案