【问题标题】:TSQL: WITH cteTABLE insert into other_table [duplicate]TSQL:将 cteTABLE 插入到 other_table [重复]
【发布时间】:2012-01-18 14:35:58
【问题描述】:

可能重复:
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 关键字。 如何在存储过程中进行这种插入?

谢谢!

【问题讨论】:

  • 你能用准确的代码和错误编辑你的帖子吗?您的第一个代码块有一个错误——它要么需要作为两个语句运行,要么在批次之间放置一个 GO。此外,我能够毫无错误地执行该过程。虽然@JNK 必须是批处理中的第一项是正确的,但我在这里看到的唯一要求是拆分创建表和临时 with-select。
  • @EBarr - 第一个语句有效,但第二个无效。听起来您认为第一个语句不起作用。
  • 没错。如果您剪切并粘贴第一个块,则会出现语法错误(消息 102,级别 15,状态 1,第 7 行。“t_table”附近的语法不正确)。它应该在创建表和 WITH 之间有一个“GO”,或者在创建表之后有一个分号。

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


【解决方案1】:

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

只需在WITH 前加一个分号就可以了:

;WITH t_Table...

编辑:

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

否则,您可能会有一些模棱两可的内容,例如:

SELECT Field
FROM MyTable
WITH CteName
As
(Select 1)

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

【讨论】:

  • +1 :或者,换一种说法,确保前面的命令以; 终止。在大多数情况下它是可选的,但在使用 CTE 时需要“正确”终止前一个命令。
猜你喜欢
  • 2012-06-30
  • 2011-04-07
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 2014-09-17
  • 1970-01-01
相关资源
最近更新 更多