Sql 语法不正确-With语句
我有一个从存储过程表截断和插入数据的查询。但是,我不能创建存储过程,因为我已经创建了存储过程;INSERT到表后的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
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
谢谢你的快速回答。我有这个选择,但是,我想从专家那里确认一下。这个答案在你接受答案之前就发布了。谢谢你的快速回答。我有这个选择,但是,我想从专家那里确认一下。这个答案在你接受答案之前就发布了。