【问题标题】:INSERT INTO WITH Common Table Expression - SQL Server [duplicate]INSERT INTO WITH Common Table Expression - SQL Server [重复]
【发布时间】:2015-12-22 23:20:45
【问题描述】:

我已经想出如何使用通用表表达式递归查找所有向某个经理汇报的员工(感谢 StackOverflow!)。

这是适合我的代码:

WITH MyCTE AS 
(
    SELECT [WWID] FROM [x500]..[WorkerPublicExtended] 
    WHERE [MgrWWID] = '10624529' AND ([StatCode] = 'A') AND ([BadgeType] = 'BB') 
    UNION ALL 
    SELECT [WorkerPublicExtended].[WWID] FROM [x500]..[WorkerPublicExtended] 
        INNER JOIN MyCTE ON [WorkerPublicExtended].[MgrWWID] = MyCTE.WWID 
    WHERE [WorkerPublicExtended].[MgrWWID] IS NOT NULL 
        AND ([BadgeType] = 'BB') AND ([StatCode] = 'A')
) 

SELECT *, 'MGR+10624529' AS [source] FROM MyCTE

这非常有效。但是,如果我尝试将其插入到另一个表中(这是最终目标),我找不到任何不会引发一个或多个错误的代码的语法变体。有人可以帮我把这些放在一起吗?

INSERT INTO [LTDtraining].[dbo].[pop00001]
WITH MyCTE AS 
(
    SELECT [WWID] FROM [x500]..[WorkerPublicExtended] 
    WHERE [MgrWWID] = '10624529' AND ([StatCode] = 'A') AND ([BadgeType] = 'BB') 
    UNION ALL 
    SELECT [WorkerPublicExtended].[WWID] FROM [x500]..[WorkerPublicExtended] 
        INNER JOIN MyCTE ON [WorkerPublicExtended].[MgrWWID] = MyCTE.WWID 
    WHERE [WorkerPublicExtended].[MgrWWID] IS NOT NULL 
        AND ([BadgeType] = 'BB') AND ([StatCode] = 'A')
) 

SELECT *, 'MGR+10624529' AS [source] FROM MyCTE

它会抛出如下错误:

消息 102,第 15 级,状态 1,第 2 行
'MyCTE' 附近的语法不正确。

或者永远流行的

消息 156,第 15 级,状态 1,第 2 行
关键字“WITH”附近的语法不正确。

消息 319,第 15 级,状态 1,第 2 行
关键字“with”附近的语法不正确。如果这个语句是一个公用表表达式、一个 xmlnamespaces 子句或一个更改跟踪上下文子句,则前面的语句必须以分号结束。

消息 102,第 15 级,状态 1,第 9 行
')' 附近的语法不正确。

如果我插入建议的分号,它会响应

消息 102,第 15 级,状态 1,第 1 行
';' 附近的语法不正确。

所以这让我觉得我不知道我在这里做什么,SQL 也不知道。

【问题讨论】:

  • 尝试将插入语句放在 CTE 之后(例如 'WITH CTE AS (...) INSERT...'

标签: sql sql-server insert sql-server-2012 common-table-expression


【解决方案1】:

可以通过将INSERT 语句向下移动到WITH 下方来轻松修复错误,如下所示:

WITH MyCTE AS 
(
    SELECT [WWID] FROM [x500]..[WorkerPublicExtended] 
    WHERE [MgrWWID] = '10624529' AND ([StatCode] = 'A') AND ([BadgeType] = 'BB') 
    UNION ALL 
    SELECT [WorkerPublicExtended].[WWID] FROM [x500]..[WorkerPublicExtended] 
        INNER JOIN MyCTE ON [WorkerPublicExtended].[MgrWWID] = MyCTE.WWID 
    WHERE [WorkerPublicExtended].[MgrWWID] IS NOT NULL 
        AND ([BadgeType] = 'BB') AND ([StatCode] = 'A')
)

INSERT INTO [LTDtraining].[dbo].[pop00001] 
SELECT *, 'MGR+10624529' AS [source] FROM MyCTE

【讨论】:

  • 分号应该放在每条语句的结尾sqlblog.com/blogs/aaron_bertrand/archive/2009/09/03/…
  • @a_horse_with_no_name 我同意,但很难养成这样做的习惯,哈哈。
  • 坚持这种写法,人们认为CTE是使用关键字;WITH开始的,这会导致这样的问题:stackoverflow.com/q/23078215/330315
  • @a_horse_with_no_name 是的,但是因为我们不知道 Richard 的代码之前是否有任何代码被调用(或者假设没有,因为他说顶级查询对他有用),我补充说分号表示安全注意事项。我就删了,下次记得在最后加分号:)。
  • 非常感谢奥多姆先生!那成功了!很高兴! :-)
猜你喜欢
  • 1970-01-01
  • 2011-06-18
  • 2023-02-09
  • 2010-10-26
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 2021-11-19
相关资源
最近更新 更多