I have a query which truncates and inserts data from the stored procedure table. However, I am not able to create stored procedure since I have ;With
statement after INSERT INTO
table. The query is below. Can someone please help me?
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
Error:
Procedure [BC].[TestStorproc], Line 40 [Batch Start Line 0]
Incorrect syntax near ‘;’
Advertisement
Answer
The error is telling you that the CTE is defined incorrectly, you must define them before your query, that is why the ;
prefix hack works, a CTE can only be the FIRST statement in a query.
Once you resolve that though, next error, is that your CTE does not have a field called fldClientId
, it only has columns a
,b
,c
…
I suspect you have over-simplified your example, for the rest of this solution lets assume that
P
has afldClientId
Move the CTE outside of the 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
However, your CTE is so simple, it’s just a column projection, and you’re not re-using it in the query, so you can transpose that inline:
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
Which again can be further simplified to:
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