如何使用oledb命令或oledb目标插入分区视图(Sql命令 - 数据访问模式)?

Din*_*esh 1 ssis

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

bil*_*nkc 6

分区视图是我不得不事先对这个问题没有经验.使用链接文章中提供的定义,我想出了这个模式和一个示例插入,以验证我知道我在做什么.

我把事务回滚了,所以我的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;
Run Code Online (Sandbox Code Playgroud)

我选择dbo.Year1998Sales了目的地和中提琴,它的工作原理.其实没有,这并不让我感到惊讶.SSMS错误在数据流中有效.

[OLE DB目标2 ]错误:SSIS错误代码DTS_E_OLEDBERROR.发生OLE DB错误.错误代码:0x80004005.OLE DB记录可用.来源:"Microsoft SQL Server的本机客户端11.0" HRESULT:0x80004005说明:"分区视图'FOO.dbo.Year1998Sales’不可更新的批量操作的目标."

解析度

此错误消息的告知部分是"批量操作的目标".数据访问模式Table or view - fast loadTable name or view name variable - fast load将导致批量插入表中,一般来说这是您想要的.然而,在这种情况下,这是不可能的因此必须使用RBAR(由痛苦鳞次栉比)目标的版本Table or viewTable name or view name variable.

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

备选方案1

完全绕过视图的逻辑构造,并使用条件拆分重新创建逻辑并写入N个表.这将允许您对表使用批量更新.但是,将业务逻辑复制到您的软件包中并对软件包进行进一步维护以使两者保持同步,这些成本并不是微不足道的.如果逻辑在底层视图中发生更改并且这些更改未传播到包或未正确移植,则Heaven会帮助您.我不会走这条路,除非我有这样做的防弹业务原因.

备选方案2

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

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