结合INSERT INTO和WITH / CTE

我有一个非常复杂的CTE,我想将结果插入物理表中。

以下有效吗?

INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos ( BatchID, AccountNo, APartyNo, SourceRowID ) WITH tab ( -- some query ) SELECT * FROM tab 

我正在考虑使用一个函数来创build这个CTE,这将允许我重用。 有什么想法吗?

您需要首先放置CTE,然后将INSERT INTO与您的select语句组合在一起。 此外,CTE名称后面的“AS”关键字不是可选的:

 WITH tab AS ( bla bla ) INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos ( BatchID, AccountNo, APartyNo, SourceRowID ) SELECT * FROM tab 

请注意,代码假定CTE将正好返回四个字段,并且这些字段按顺序匹配,并与INSERT语句中指定的字段types匹配。 如果不是这种情况,只需用特定的所需字段replace“SELECT *”即可。

至于你使用函数的问题,我会说“取决于”。 如果仅仅是因为性能的原因将数据放在表中,并且通过函数使用速度是可以接受的,那么我认为函数是一个选项。 另一方面,如果你需要在几个不同的查询中使用CTE的结果,并且速度已经是问题了,那么我需要一个表(常规或者临时)。

WITH common_table_expression(Transact-SQL)

是的:

 WITH tab ( bla bla ) INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos ( BatchID, AccountNo, APartyNo, SourceRowID) SELECT * FROM tab 

请注意,这是针对支持多个CTE的SQL Server:

 WITH x AS (), y AS () INSERT INTO z (a, b, c) SELECT a, b, c FROM y 

Teradata只允许使用一个CTE,语法就是你的例子。

Common Tableexpression式的WITH子句放在顶部。

将CTE中的每个插入包装都具有将查询逻辑从列映射中分离的好处。

发现错误:

 WITH _INSERT_ AS ( SELECT [BatchID] = blah ,[APartyNo] = blahblah ,[SourceRowID] = blahblahblah FROM Table1 AS t1 ) INSERT Table2 ([BatchID], [SourceRowID], [APartyNo]) SELECT [BatchID], [APartyNo], [SourceRowID] FROM _INSERT_ 

同样的错误:

 INSERT Table2 ( [BatchID] ,[SourceRowID] ,[APartyNo] ) SELECT [BatchID] = blah ,[APartyNo] = blahblah ,[SourceRowID] = blahblahblah FROM Table1 AS t1 

几行样板文件可以非常容易地validation代码以正确的顺序插入正确数量的列,即使列数很多也是如此。 你以后的自我会在以后谢谢你。