如何在OLE DB Command或oledb目标(数据访问模式 - sql命令)中编写查询,以便从表/视图中将数据插入分区视图。
答案 0 :(得分:6)
Partitioned View是我在此问题之前没有遇到过的事情。使用链接文章中提供的定义,我想出了schema and a sample insert来验证我知道我在做什么。
我将事务回滚,所以我的dbo.Year1998Sales
视图中没有数据。然后我创建了一个新的SSIS包。我在SQL Server 2012上使用SSIS的事实与结果无关,配置也是一样的。
我创建了一个新包,添加了一个数据流,添加了一个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 Destination 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 load
或Table name or view name variable - fast load
的数据访问模式将导致批量插入表格,通常会说出您想要的内容。但是在这种情况下,这是不可能的,因此必须使用目的地Table or view
或Table name or view name variable
的RBAR(令人痛苦的排行)。
这确实有用,对于较小的数据集,这将是我的方法。
完全绕过视图的逻辑结构,并使用条件拆分重新创建逻辑并写入N个表。这将允许您对表使用批量更新。但是,将业务逻辑复制到您的软件包中并对软件包进行进一步维护以使两者保持同步,这些成本并不是微不足道的。如果逻辑在底层视图中发生更改并且这些更改未传播到包或未正确移植,则Heaven会帮助您。除非我有防弹的商业理由,否则我不会走这条路。
暂存您的数据。而不是写入分区视图,将所有数据写入数据流中的临时表。在数据流之后,立即执行一个执行SQL任务,将数据从登台表推送到View中。
虽然我不确定,但我的假设是,这将比备选方案1或原始分辨率更好,但尚未经过测试。我也没有将此作为主要解决方案列出,因为我知道在某些地方,比如我工作的地方,创建一个新表可能会引起争议。