语法不正确 - 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
的字段,它只有列 a
、b
、c
...
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
我有一个查询,它从存储过程 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
的字段,它只有列 a
、b
、c
...
I suspect you have over-simplified your example, for the rest of this solution lets assume that
P
has afldClientId
将 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