INSERT INTO WITH 公共表表达式 - SQL Server

Ric*_*ley 4 sql sql-server insert common-table-expression sql-server-2012

我已经想出了如何使用通用表表达式(感谢 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

它抛出如下错误:

消息 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也不知道。

Joh*_*dom 5

通过将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
Run Code Online (Sandbox Code Playgroud)

  • 分号应该到每个语句的**结束**:http://sqlblog.com/blogs/aaron_bertrand/archive/2009/09/03/ladies-and-gentlemen-start-your-semi-colons.aspx (3认同)
  • 通过坚持这种写法,人们认为 CTE 是使用关键字`;WITH` 开始的,这会导致这样的问题:http://stackoverflow.com/q/23078215/330315 (2认同)
  • 非常感谢奥多姆先生!成功了!很高兴!:-) (2认同)