0

我需要将文件 abcd.txt , ijk.txt 从 C:\files 移动到它们各自的文件夹 C:\moved_files\abcd\abcd.txt 和 C:\moved_files\ijk\ijk.txt ,其中文件名和目标文件夹名称应该相同,文件夹已经存在;

我在 sql server 数据库中有以下存储过程,当提供文件名作为输入时,它返回文件夹名称,

我已将此存储过程放在 SSIS 的执行 sql 任务中,我现在希望此存储过程的输出,即文件夹名称,应被文件系统任务作为目标变量,以将文件移动到相应的文件夹。

alter PROCEDURE [dbo].[FOLDER]
( 
@CSVFILENAME AS VARCHAR(600)
)
AS
BEGIN
DECLARE @Index AS INT
DECLARE @FOLDER AS VARCHAR(50)
DECLARE @CSVFILE AS VARCHAR(500)

SET @CSVFILENAME = REPLACE(UPPER(@CSVFILENAME),'\\dm2nas1\U\sql_data\in\','')
SET @CSVFILE = @CSVFILENAME

SET @CSVFILENAME = REPLACE(UPPER(@CSVFILENAME),'.csv','')
SET @Index = CHARINDEX('_',@CSVFILENAME)

IF @CSVFILENAME LIKE '%TRACKER%'
SET @FOLDER = 'TRACKER'
ELSE
SET @FOLDER = SUBSTRING(@CSVFILENAME,@Index + 1,LEN(@CSVFILENAME))
SELECT @FOLDER
END

对于每个循环容器,我都有执行 sql 任务和文件系统任务,以及两个变量 user::filename 和 user::destfolder。我希望存储过程的输出,即文件夹名称存储在变量 user::destfolder 中,然后可以在文件系统任务中的目标变量值中给出
有人可以帮助我进行变量映射,以便移动文件根据存储过程的输出到目标文件夹。

4

1 回答 1

0

一般的想法是您将存储过程的结果(通过SQL Execute Task)粘贴到(ADO?)对象变量中。这将充当 DataTable 或 DataSet(取决于您从 中返回的内容Execute SQL task),如果您使用 Foreach 循环容器,则返回的列可以映射到变量。

这里是一步一步的说明

您需要修改您的存储过程,使其返回您想要的文件名和目标文件夹的两个值。还要记住列顺序,即SELECT @CSVFILE, @FOLDER

  1. 创建一个对象变量 (User::objResults)。
  2. 创建一个Execute SQL Task
    • 在常规选项卡中
      1. 添加存储过程的名称
      2. 设置结果集(单行或完整结果集)
    • 在结果集选项卡中
      1. 添加新项目 ResultName 为 0
      2. 将变量名设置为 User::objResults
  3. 将您附加Foreach Loop Container到末尾`Execute SQL Task并将枚举器设置为 ADO 枚举器。
于 2013-03-12T09:26:00.533 回答