我有一个看起来像这样的声明:
MERGE INTO someTable st
USING
(
SELECT id,field1,field2,etc FROM otherTable
) ot on st.field1=ot.field1
WHEN NOT MATCHED THEN
INSERT (field1,field2,etc)
VALUES (ot.field1,ot.field2,ot.etc)
where 其他表有一个自动递增的id field.
我想插入一些表与id现场其他表,使得order of id当插入不匹配的字段时,s 被保留。
快速浏览一下docs http://technet.microsoft.com/en-us/library/bb510625.aspx似乎表明没有任何功能支持这一点。
这是否可能,或者是否有其他方法可以满足我的要求进行插入?
编辑:一种方法是添加一个附加字段一些表捕获顺序。如果可能的话我宁愿不这样做。
...经过反思,上述方法似乎是可行的方法。
我无法说出发问者在这里提出的要求,因为它并不能说明问题any sense.
那么让我们假设一个不同的问题:
相反,假设我有一个没有标识字段的堆表,但它确实有一个“Visited“ 日期字段。
堆表记录人员网页访问,我将其加载到我的数据仓库中。
在此数据仓库中,我想使用代理键“WebHitID”来引用这些关系。
让我们使用 Merge 来执行表的初始加载,然后继续调用它以保持表同步。
我知道,如果我将记录插入到表中,那么我希望 ID(由识别字段生成)根据我选择的任何排序方式(假设“Visited" Date).
期望整数 ID 与它的创建时间相对于表中的其余记录相关联的情况并不少见。
我知道这并不总是 100% 的情况,但请容我容一下。
这可以通过合并实现。
使用(感觉就像hack) TOP 将允许在我们的插入中进行排序:
MERGE DW.dbo.WebHit AS Target --This table as an Identity Field called WebHitID.
USING
(
SELECT TOP 9223372036854775807 --Biggest BigInt (to be safe).
PWV.PersonID, PWV.WebPageID, PWV.Visited
FROM ProdDB.dbo.Person_WebPage_Visit AS PWV
ORDER BY PWV.Visited --Works only with TOP when inside a MERGE statement.
) AS Source
ON Source.PersonID = Target.PersonID
AND Source.WebPageID = Target.WebPageID
AND Source.Visited = Target.Visited
WHEN NOT MATCHED BY Target THEN --Not in Target-Table, but in Source-Table.
INSERT (PersonID, WebPageID, Visited) --This Insert populates our WebHitID.
VALUES (Source.PersonID, Source.WebPageID, Source.Visited)
WHEN NOT MATCHED BY Source THEN --In Target-Table, but not in Source-Table.
DELETE --In case our WebHit log in Prod is archived/trimmed to save space.
;
您可以看到我选择使用 TOP 9223372036854775807 (最大的整数)来提取所有内容。
如果你有足够的资源来合并更多的资源,那么你应该将其分块。
虽然这尖叫声“黑客解决方法“对我来说,它应该带你去你需要去的地方。
我已经在一个小样本集上对此进行了测试并验证了它的工作原理。
不过,我还没有研究过它对更大的复杂数据集的性能影响,所以 YMMV 有或没有 TOP。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)