语法不正确 - With 语句

Incorrect Syntax - With Statement

我有一个查询,它从存储过程 table 截断和插入数据。但是,我无法创建存储过程,因为我在 INSERT INTO table 之后有 ;With 语句。查询如下。有人可以帮我吗?

CREATE PROCEDURE [BC].[TestStoredProc]
AS
BEGIN TRY
    set nocount on
    set xact_abort on
    set ansi_warnings off
    set arithabort off
    set arithignore on

BEGIN TRAN
    TRUNCATE TABLE [S].[sample]

    INSERT INTO [S].[sample] ([ColumnID])
        ;WITH P AS 
        (
            SELECT a, b, c
            FROM testtable
        )
    
    SELECT PC.columnID
    FROM ABC RC
    LEFT JOIN BCD CC ON RC.BCD = CC.BCD
    LEFT JOIN P PC ON RC.fldClientId = PC.fldPersonID
    
    
    COMMIT TRAN
END TRY
BEGIN CATCH
    IF (XACT_STATE() <> 0)
    BEGIN
        ROLLBACK TRANSACTION
    END;

    THROW;
END CATCH

RETURN 0

错误:

Procedure [BC].[TestStorproc], Line 40 [Batch Start Line 0]
Incorrect syntax near ';'

也许不是一个确切的答案,但您应该可以在此处内联 CTE。实际上,我在你的 CTE 中没有看到任何过滤或聚合,所以也许直接加入 table:

INSERT INTO [S].[sample] ([ColumnID])

SELECT PC.columnID
FROM ABC RC
LEFT JOIN BCD CC ON RC.BCD = CC.BCD
LEFT JOIN testtable PC ON RC.fldClientId = PC.fldPersonID

错误告诉您 CTE 定义不正确,您必须在查询之前定义它们,这就是 ; 前缀 hack 起作用的原因,CTE 只能是 FIRST 查询中的语句。

一旦您解决了该问题,下一个错误是您的 CTE 没有名为 fldClientId 的字段,它只有列 abc...

I suspect you have over-simplified your example, for the rest of this solution lets assume that P has a fldClientId

将 CTE 移到 INSERT 之外:

;With P as (
    SELECT a, b, c, fldClientId
    FROM testtable
)
INSERT INTO [S].[sample]([ColumnID])
SELECT PC.columnID
FROM ABC RC
LEFT JOIN BCD CC on RC.BCD = CC.BCD
LEFT JOIN P PC on RC.fldClientId = PC.fldPersonID

但是,您的 CTE 非常简单,它只是一个列投影,您没有在查询中重复使用它,因此您可以内联转置:

INSERT INTO [S].[sample]([ColumnID])
SELECT PC.columnID
FROM ABC RC
LEFT JOIN BCD CC on RC.BCD = CC.BCD
LEFT JOIN (
    SELECT a, b, c, fldClientId 
    FROM testtable
) AS PC on RC.fldClientId = PC.fldPersonID

这又可以进一步简化为:

INSERT INTO [S].[sample]([ColumnID])
SELECT PC.columnID
FROM ABC RC
LEFT JOIN BCD CC on RC.BCD = CC.BCD
LEFT JOIN testtable AS PC on RC.fldClientId = PC.fldPersonID