【发布时间】:2013-04-25 14:45:44
【问题描述】:
当我在 SQL Fiddle 中运行此查询时,它运行完美:
;with cte as
(SELECT
analysisvalue.analysisid,
heatname,
analysistime,
sampletype,
grade,
productid,
element,
value
FROM
dbo.AnalysisValue
INNER JOIN
dbo.CAnalysis
ON
dbo.AnalysisValue.AnalysisID = dbo.CAnalysis.AnalysisID
WHERE
heatname = 'A7M0066'
)
SELECT
*
FROM
S_analysis s
CROSS JOIN (SELECT TOP 1 analysistime
FROM cte
ORDER BY analysisid desc
) c
WHERE s.heat_no = 'A7M0066' OR
(s.analysis_datetime BETWEEN c.analysistime AND DATEADD(hh, 2, c.analysistime ))
但是,当我在 SQL Server 2012 中运行它时,我收到带有前导分号的错误:
Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near ';'.
没有分号时会出现这个错误:
Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'with'.
【问题讨论】:
-
我认为没有必要使用 WITH
-
@Luv 删除后我收到错误:Msg 156, Level 15, State 1, Line 1 关键字'as'附近的语法不正确。
-
如果您将此代码复制并粘贴到 SQL Server 2012 中的 SSMS 中并单击复选标记 (Parse) 按钮,是否会出现相同的错误?
-
作为旁注,阅读this blog by Aaron Bertrand,它应该有望改变您对正确终止语句的看法。人们倾向于认为他们必须使用
;WITH,但是如果最后一个语句正确终止,您不必担心在某些关键字前面加上分号。您可以像使用任何其他语句一样使用WITH开始您的 CTE。 -
请链接工作小提琴
标签: sql sql-server sqlfiddle