【发布时间】:2017-02-14 14:52:36
【问题描述】:
今天我有一个新情况,客户问以下问题:
我们在一个文件夹中有 XML 文件。我们需要将这些文件加载到 SQL Server 表列(具有 XML 数据类型)中;我们不是将 XML 输出加载到各种 SQL Server 表中,而是将 XML 文件本身加载到 SQL Server 数据库中具有 XML 数据类型的列中。
根据客户的要求,这应该只在 SSIS 中完成。所以我以这种方式使用执行 SQL 任务。 (除了XML文件,我们还需要ImportDate、FileName等)
连接类型为 OLE DB;我的 SQL 语句如下:
INSERT INTO dbo.tablename (IncomingXMLfile, ImportDate)
-- I am using just 2 columns as an example for this table--
SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE()
FROM OPENROWSET(BULK 'C:\Mic\...........\API_Schemas\ABC.xml', SINGLE_BLOB) AS x;
当我只用一个文件进行硬编码时,这很好用。现在,在C:\Mic\...\API_Schemas 文件夹中,有许多 XML 文件,我需要加载每个文件,除此之外,获取它们的ImportDate(即GETDATE()),以及文件本身的名称(我暂时没有在 INSERT 语句中提及此列)。我必须使用 ForEachLoop 容器,并将执行 SQL 任务放在这个容器中。
因此这个问题有两个方面:
在执行 SQL 任务中参数化文件名。
使用 ForEachLoop Container(并将此 Execute SQL Task 放入其中)运行文件夹中的每个 XML 文件。
我使用了一个名为Filename(字符串数据类型)的用户变量,它的值是ABC.xml(文件夹中一系列XML文件中的第一个文件);我以这种方式参数化上述 TSQL 查询(见下文):
INSERT INTO dbo.tablename (IncomingXMLfile, ImportDate)
SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE()
FROM OPENROWSET(BULK 'C:\Mic\...........\API_Schemas\?', SINGLE_BLOB) AS x;
我将此参数 (?) 映射到此执行 SQL 任务 (ParameterMapping 选项卡) 中的用户变量文件名。查询在执行 SQL 任务中正确解析!但是,当我执行这个 SQL 任务时,我得到了这个错误:
“参数名称无法识别。”。可能的失败原因:查询有问题,“ResultSet”属性设置不正确,参数设置不正确,或者连接没有正确建立。
当我将 XML 文件中的数据(使用 XML 源编辑器,使用数据访问模式(来自变量的 XML 数据)等)加载到 SQL Server 表中时,这种情况完全不同。在我们的例子中,我们将 XML 文件本身加载到具有 XML 数据类型的 SQL Server 表 COLUMN 中,并获取有关从文件夹加载的各种 XML 文件的信息。结果我不确定如何使用变量来运行这个包。
谁能帮助我正确地参数化文件名?
之后如何配置 ForEachLoop 容器从文件夹中读取每个文件?
我对如何在这种情况下使用用户变量感到困惑。
【问题讨论】:
-
最直接的方法是在while循环中使用动态SQL。将文件夹中的文件列表获取到临时表中,首先获取,生成查询运行它到第二个......等等。或者甚至生成一个大语句并立即运行它。
-
你能给我提供一个在这种情况下如何使用动态 SQL 的例子吗?我在各种情况下都使用过动态 SQL,但不是在这种情况下。
-
我添加了带有动态 SQL 的解决方案作为答案。
标签: sql-server xml parameters ssis user-variables