【问题标题】:Works in SQLFiddle Not in SQL Server 2012适用于 SQLFiddle 不适用于 SQL Server 2012
【发布时间】: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


【解决方案1】:

您可以使用 #temp 表来代替 CTE,并查看查询是否有效:

SELECT 
analysisvalue.analysisid, 
heatname, 
analysistime, 
sampletype,
grade, 
productid, 
element, 
value 
INTO #temptable
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 #temptable
ORDER BY analysisid desc
) c
WHERE s.heat_no = 'A7M0066' OR
(s.analysis_datetime BETWEEN c.analysistime AND DATEADD(hh, 2, c.analysistime ))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 2018-12-27
    • 2012-12-17
    • 2016-11-16
    相关资源
    最近更新 更多