结合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代码以正确的顺序插入正确数量的列,即使列数很多也是如此。 你以后的自我会在以后谢谢你。