通过SSIS在SQL中插入XML文件

ale*_*ero 0 sql sql-server ssis sql-server-2008

我有这个程序

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 );
Run Code Online (Sandbox Code Playgroud)

上面的代码有效.

是否可以使用Integration Services将路径中的所有XML文件插入到SQL表中?

bil*_*nkc 11

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

第一个是user569711概述并使用ForEach枚举器并调用现有的存储过程.这样做的好处是您的行为应该与您当前遇到的完全一样,并且您的测试应该只关注确保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";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

导入列转换

像这样配置

在此输入图像描述

在这里记下ID

在此输入图像描述

将该ID与名称绑定回列

在此输入图像描述

OLE DB目标

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

在此输入图像描述

在此输入图像描述

参考

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