1

如何在 OLE DB 命令或 oledb 目标(数据访问模式 - sql 命令)中编写查询以将数据从表/视图插入到分区视图。

4

1 回答 1

6

分区视图是我在这个问题之前没有经验的东西。使用链接文章中提供的定义,我想出了这个模式和一个示例插入来验证我知道我在做什么。

我回滚了事务,所以我的dbo.Year1998Sales视图中没有数据。然后我创建了一个新的 SSIS 包。我将 SSIS 用于 SQL Server 2012 的事实与结果无关,配置将是相同的。

我创建了一个新包,添加了一个数据流,添加了一个 OLE DB 连接管理器,在我的数据流中,我有一个连接到 OLE DB 目标的 OLE DB 源。

在此处输入图像描述

在我的源代码中,我使用了与我的 SQLFiddle 演示中相同的查询

SELECT 
    D.number AS OrderId
,   D.number * 100 AS CustomerID
,   DATEADD(D, d.number % 365, '1998-01-01') AS OrderDate
,   1+ (D.number % 12) AS OrderMonth
,   DATEADD(mm, (D.number % 12), '1998-01-01') AS DeliveryDate
FROM
(
    SELECT
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS some_number  
    FROM
        master.dbo.spt_values AS SV  
) D (number)
ORDER BY D.number ASC;

我选择dbo.Year1998Sales了目的地和中提琴,它可以工作。其实不,这并没有让我感到惊讶。SSMS 中起作用的内容在数据流中出错。

[OLE DB 目标2 ] 错误:SSIS 错误代码 DTS_E_OLEDBERROR。发生 OLE DB 错误。错误代码:0x80004005。OLE DB 记录可用。来源:“Microsoft SQL Server Native Client 11.0” Hresult:0x80004005 描述:“分区视图 'FOO.dbo.Year1998Sales' 不可更新为批量操作的目标。”。

解析度

此错误消息的重要部分是“批量操作的目标”。Table or view - fast loador的数据访问模式Table name or view name variable - fast load将导致向表中批量插入,一般来说这是您想要的。但是在这种情况下,这是不可能的,因此必须使用目的地的 RBAR(逐行)版本Table or viewTable name or view name variable.

这确实有效,对于较小的数据集,这将是我的方法。

备选方案 1

完全绕过视图的逻辑构造,通过条件拆分重新创建逻辑并写入 N 个表。这将允许您对表使用批量更新。但是,将业务逻辑复制到您的包中并进一步维护包以使两者保持同步,相关的成本并非微不足道。如果底层视图中的逻辑发生更改并且这些更改没有传播到包或移植不正确,天堂会帮助您。除非我有可靠的商业理由这样做,否则我不会走这条路。

备选方案 2

暂存您的数据。不是写入分区视图,而是将所有数据写入数据流中的临时表。在数据流之后,立即执行 SQL 任务,将数据从暂存表推送到视图中。

虽然我不确定,但我的假设是这将比备选方案 1 或原始分辨率更好,但尚未测试。我也没有将此列为主要解决方案,因为我知道在某些地方,例如我工作的地方,创建新表可能会引起很大争议。

于 2013-01-25T20:58:49.603 回答