代码之家  ›  专栏  ›  技术社区  ›  Stephanie

如何将SQL表中的数据导出到SSIS中的多个excel文件?

  •  5
  • Stephanie  · 技术社区  · 7 年前

    我创建了一个SSIS包,可以从SQL中提取数据并将其加载到excel中。我无法将此包动态化并将数据加载到多个excel文件中。

    我首先创建了一个执行SQL任务,该任务包含所有包含SQL代码的文件名: SELECT FileName FROM Files 其结果集将存储在变量中 FileNameObj . 然后,我创建了一个Foreach循环容器,并在其中添加了一个数据流任务。

    Foreach循环容器设置: Foreach ADO枚举器,ADO对象源变量- FileNameObj ,变量映射- FileName 和索引-0。在“数据流任务”下,我添加了指向文件路径的OLE DB源和Excel目标: C:\Test\ABC.xlsx .

    以下是连接管理器属性:

    连接串 : Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test\ABC.xlsx;Extended Properties="Excel 12.0;HDR=YES";

    延迟验证 设置为 True

    ExcelFilePath C: \测试\ ABC。xlsx

    然后我创建了一个具有属性的表达式 ExcelFilePath 和表达式: "C:\\Test\\"+ @[User::FileName]+".xlsx" 然后我的 连接串 更改为: Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test\.xlsx;Extended Properties="Excel 12.0;HDR=YES";

    我已经在测试文件夹中创建了所有文件模板(所有文件的结构都相同)。我得到以下错误:

    数据流任务[Excel Destination[131]]出错:SSIS错误代码DTS\U E\U OLEDERROR。发生OLE DB错误。错误代码:0x80040E37。

    数据流任务[Excel Destination[131]]出错:打开“Sheet1$”的行集失败。检查数据库中是否存在该对象。

    HRESULT异常:0xC02020E8(Microsoft.SqlServer.DTSPipelineWrap)

    我做错了什么?或者甚至可以在SSIS中执行此操作?

    1

    2

    3]

    4]

    5]

    6]

    7]

    8]

    9]

    10

    11

    12

    3 回复  |  直到 7 年前
        1
  •  2
  •   Nick.Mc    7 年前

    请参见此处: Dynamically assign filename to excel connection string

    使用 ExcelFilePath ConnectionString

    我想澄清一下:

    • 如果要将具有相同列的相同数据加载到多个excel工作表中,只需导出一次并在文档上进行文件复制就会容易得多
    • 如果每个工作表都有不同的列,那么这将不起作用-每个数据流每次运行时都需要有相同的列

    • 如果加载的是相同的列,但过滤的数据不同,那么可能需要考虑这样做的原因。它是为了克服excel中的行限制吗?如果是,请改为导出到CSV。是否为用户生成自定义报告?请考虑使用报告工具。

        2
  •  1
  •   Hadi    3 年前

    动态Excel连接字符串

    首先,excel connectionstring .XLSX 格式如下:

    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Test\\"+ @[User::FileName]+ ".xlsx; Extended Properties=\"Excel 12.0 Xml;HDR=YES\";"
    

    推荐的方法是 (@Nick.McDermaid提到的内容) ,将值指定给 ExcelFilePath 所有物

    但你必须考虑到许多其他事情:

    1. 所有excel文件必须具有相同的结构, 否则,此程序包将始终失败 .
    2. 设置数据流任务 Delay Validation 属性到 True

    工具书类


    更新1

    您应该尝试很多事情:

    1. 安装Access数据库引擎

    下载链接: Microsoft Access Database Engine 2010 Redistributable

    1. 以32位模式运行包

    在项目属性中,将64位运行时属性更改为False

    1. 检查 Sheet1 存在于所有模板中

    2. filepath 变量

        3
  •  1
  •   Stephanie    7 年前

    我找到了自己问题的解决方案:为 FileName 变量我已分配 ABC 它成功了。按预期生成了两个文件,一个用于ABC,一个用于DEF。