TSQL:WITH cteTABLE插入other_table

时间:2011-12-12 15:57:20

标签: sql sql-server tsql with-statement insert-select

  

可能重复:
  Incorrect syntax near the keyword 'with'…previous statement must be terminated with a semicolon

我想选择分层数据并将其插入表格中。 因此我需要在插入中使用WITH语句。

这很好用:

create table test_table
(
 id int
)   

with t_table 
as
(select 12345 wert)
insert into test_table (id)
select wert from t_table

但这会产生“WITH关键字附近的错误语法”错误:

CREATE PROCEDURE p_insert_test
AS
BEGIN

with t_table 
as
(select 12345 wert)
insert into test_table (id)
select wert from t_table

END

我猜T-SQL在INSERT关键字之前不喜欢WITH关键字。 如何在存储过程中执行此类插入?

谢谢!

1 个答案:

答案 0 :(得分:5)

CTE声明需要是批次中的第一个命令。

只需在WITH之前添加一个分号,你应该没问题:

;WITH t_Table...

修改

为了澄清为什么这种情况,WITH关键字也用于查询提示,例如WITH RECOMPILEWITH (NOLOCK)等。查询引擎需要知道WITH关键字的意图,并且表示它代表CTE的唯一方法是确保CTE声明是批处理的开头。

否则,你可能会有一些含糊不清的东西:

SELECT Field
FROM MyTable
WITH CteName
As
(Select 1)

如果没有语句终结符,CteName将被不恰当地理解为应用于MyTable的查询提示。