为了账号安全,请及时绑定邮箱和手机立即绑定

将INSERT INTO和WITH / CTE结合

将INSERT INTO和WITH / CTE结合

慕森卡 2019-11-28 15:11:09
我的CTE非常复杂,我想将结果插入物理表中。以下有效吗?INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos (    BatchID,    AccountNo,    APartyNo,    SourceRowID)       WITH tab (  -- some query)    SELECT * FROM tab我正在考虑使用一个函数来创建此CTE,这将允许我重复使用。有什么想法吗?
查看完整描述

3 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

您需要先放置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语句中指定的匹配。如果不是这种情况,只需将“ SELECT *”替换为所需的特定字段即可。


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


带common_table_expression(Transact-SQL)


查看完整回答
反对 回复 2019-11-28
?
三国纷争

TA贡献1804条经验 获得超7个赞

是的:


WITH tab (

  bla bla

)


INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos (  BatchID,                                                        AccountNo,

APartyNo,

SourceRowID)    


SELECT * FROM tab

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


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

Teradata仅允许一个CTE,并且语法示例。


查看完整回答
反对 回复 2019-11-28
  • 3 回答
  • 0 关注
  • 1788 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信