Sql 语法不正确-With语句

Sql 语法不正确-With语句,sql,common-table-expression,Sql,Common Table Expression,我有一个从存储过程表截断和插入数据的查询。但是,我不能创建存储过程,因为我已经创建了存储过程;INSERT到表后的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 TR

我有一个从存储过程表截断和插入数据的查询。但是,我不能创建存储过程,因为我已经创建了存储过程;INSERT到表后的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
错误:

过程[BC].[TestStorproc],第40行[批处理起始行0] “;”附近的语法不正确


也许不是一个确切的答案,但您应该能够在这里直接内联CTE。事实上,我在您的CTE中没有看到任何过滤或聚合,因此可能直接连接到表:

插入[S].[sample][ColumnID] 选择PC.columnID 来自ABC RC 左连接BCD CC ON RC.BCD=CC.BCD RC.fldClientId=PC.fldPersonID上的左连接测试表PC
也许不是一个确切的答案,但您应该能够在这里直接内联CTE。事实上,我在您的CTE中没有看到任何过滤或聚合,因此可能直接连接到表:

插入[S].[sample][ColumnID] 选择PC.columnID 来自ABC RC 左连接BCD CC ON RC.BCD=CC.BCD RC.fldClientId=PC.fldPersonID上的左连接测试表PC
错误告诉您CTE定义不正确,您必须在查询之前定义它们,这就是为什么;前缀破解有效,CTE只能是查询中的第一条语句

一旦您解决了这个问题,下一个错误是您的CTE没有名为fldClientId的字段,它只有a、b、c列

我怀疑您过度简化了示例,对于本解决方案的其余部分,让我们假设p有一个fldClientId

将CTE移出插件:

但是,您的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

错误告诉您CTE定义不正确,您必须在查询之前定义它们,这就是为什么;前缀破解有效,CTE只能是查询中的第一条语句

一旦您解决了这个问题,下一个错误是您的CTE没有名为fldClientId的字段,它只有a、b、c列

我怀疑您过度简化了示例,对于本解决方案的其余部分,让我们假设p有一个fldClientId

将CTE移出插件:

但是,您的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

谢谢你的快速回答。我有这个选择,但是,我想从专家那里确认一下。这个答案在你接受答案之前就发布了。谢谢你的快速回答。我有这个选择,但是,我想从专家那里确认一下。这个答案在你接受答案之前就发布了。