关键字'with'附近的语法不正确.如果此语句是公用表表达式

Nil*_*ish 5 sql-server sql-server-2005 sql-server-2008

create table #temp
(
  pName Varchar(20),
  DateBegin DateTime,
  DateEnd DateTime
)

Insert Into #temp(pName, DateBegin, DateEnd)
Values('Player1', '01/04/2012', '01/05/2012')

Insert Into #temp(pName, DateBegin, DateEnd)
Values('Player2', '02/01/2012', '02/05/2012')


With DateRange(dt) As
(
    Select Convert(Datetime, '01/01/2012')
    UNion All
    Select DateAdd(dd, 1, Dat.dt) From DateRange Dat Where Dat.dt < CONVERT(Datetime, '01/31/2012')
)

Select T.pName, Dt.dt from #temp T
Inner Join DateRange Dt on Dt.dt BETWEEN T.DateBegin and T.DateEnd

Drop Table #temp
Run Code Online (Sandbox Code Playgroud)

问题在于以下代码行

With DateRange(dt) As
Run Code Online (Sandbox Code Playgroud)

它显示以下错误消息

关键字'with'附近的语法不正确.如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则必须以分号终止先前的语句.

aqu*_*nas 7

添加一些分号:

create table #temp
(
  pName Varchar(20),
  DateBegin DateTime,
  DateEnd DateTime
)

Insert Into #temp(pName, DateBegin, DateEnd)
Values('Player1', '01/04/2012', '01/05/2012')

Insert Into #temp(pName, DateBegin, DateEnd)
Values('Player2', '02/01/2012', '02/05/2012');

With DateRange(dt) As
(
    Select Convert(Datetime, '01/01/2012')
    UNion All
    Select DateAdd(dd, 1, Dat.dt) From DateRange Dat Where Dat.dt < CONVERT(Datetime, '01/31/2012')
)

Select T.pName, Dt.dt from #temp T
Inner Join DateRange Dt on Dt.dt BETWEEN T.DateBegin and T.DateEnd;

Drop Table #temp
Run Code Online (Sandbox Code Playgroud)

http://sqlfiddle.com/#!6/06e89

编辑:另外,你实际上没有问题.您是否安装了一个插件,可以自动将输出从SQL Server Mangement Studio错误日志传递到StackOverflow问题?:)


Cha*_*age 6

我在 SQL Server 2017 中遇到了同样的问题。在 WITH 语句之前使用分号,如下所示。

;WITH
Run Code Online (Sandbox Code Playgroud)