0

我有这个程序

ALTER proc [dbo].[adenti] 
(
   @entra nvarchar(max)
)
as 
DECLARE @sql varchar(4000); 
SET @sql = 'INSERT INTO provaxml (arquivo) SELECT CAST(BulkColumn AS XML) FROM OPENROWSET(BULK ''' + @entra + ''', SINGLE_BLOB) as arquivo'; 
EXEC( @sql );

上面的代码有效。

是否可以使用集成服务将路径中的所有 XML 文件插入到 SQL 表中?

4

1 回答 1

12

您可以采用两种不同的方法。

第一个是作为 user569711 概述并使用 ForEach Enumerator 并调用您现有的存储过程。这样做的好处是您的行为应该与您当前所经历的完全一样,并且您的测试只需要专注于确保 SSIS 包选择正确的文件。

第二种是使用 SSIS 的开箱即用功能来处理导入 BLOB 类型。

控制流

您将需要根据您的方法定义 1 到 2 个变量。两者都是字符串数据类型。我创建了SourceFolderCurrentFileName. 前者定义了文件的来源并在任一方法中使用。后者在 ForEach 循环容器中用于捕获“当前”文件。

控制流

数据流

要使数据流正常工作,您需要将完全限定的文件名列表添加到管道中。最简单的方法是使用脚本转换,作为源并将其添加到所有满足您条件的文件(*.xml)中。

数据流

Foreach 循环容器

像这样配置

收藏

在此处输入图像描述

变量映射

在此处输入图像描述

执行 SQL 任务

如此配置

在此处输入图像描述

在此处输入图像描述

脚本源

此任务会将可用文件添加到数据流中。次要注意,这将遍历与我们配置 Foreach 的方式不同的子文件夹。这是对第三个参数(或省略)的简单更改,使其仅位于顶层。

识别您的变量,使其在脚本任务中可用

在此处输入图像描述

添加适当的输出列。您的长度可能因您的环境而异。

在此处输入图像描述

脚本在这里

using System;
using System.Data;
using System.IO;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{

    public override void CreateNewOutputRows()
    {
        string fileMask = string.Empty;
        string sourceFolder = string.Empty;

        fileMask = @"*.xml";
        sourceFolder = this.Variables.SourceFolder;

        foreach (string fileName in Directory.GetFiles(sourceFolder, fileMask, SearchOption.AllDirectories))
        {
            Output0Buffer.AddRow();
            Output0Buffer.FileName = fileName;
            Output0Buffer.SourceName = "Dataflow";
        }
    }
}

导入列转换

像这样配置

在此处输入图像描述

在此处记下 ID

在此处输入图像描述

将该 ID 绑定到具有名称的列

在此处输入图像描述

OLE DB 目标

配置。不支持快速加载选项。

在此处输入图像描述

在此处输入图像描述

参考

关于使用导入列转换的好帖子

于 2012-10-10T18:04:47.067 回答