SQL Server报错:Incorrect syntax near '(',求CERINTA5语法修正及模式复用可行性
解决SQL语法错误:Incorrect syntax near '('. Expecting EDGE_TYPE or ID.
从你代码里的IDENTITY、CURRENT_TIMESTAMP这些语法能判断出,你用的是SQL Server数据库——而SQL Server不支持CREATE TABLE ... AS (SELECT ...)这种MySQL/PostgreSQL风格的语法,这就是触发错误的核心原因。
两种可行解决方案,其中一种可直接复用CERINTA4的查询模式
方案1:改用SQL Server支持的语法创建中间表
如果你确实需要保留prop2veh这个中间表,把CERINTA5的创建语句替换成SQL Server原生支持的SELECT ... INTO写法:
-- 替换原CREATE TABLE语句,用SELECT INTO创建新表并插入数据 SELECT proprietate.PERSOANA_ID, proprietate.NR_VEHICUL INTO prop2veh FROM proprietate INNER JOIN vehicul ON proprietate.NR_VEHICUL=vehicul.NR_VEHICUL; -- 原统计查询可直接保留 SELECT PERSOANA_ID, Count(*) As total FROM prop2veh Group By PERSOANA_ID Having Count(*) > 2;
方案2:复用CERINTA4的直接查询模式(更高效,无需中间表)
CERINTA4的核心逻辑是直接通过关联查询获取结果,不依赖额外中间表,你可以把CERINTA5的统计逻辑合并成一个子查询,完全跳过prop2veh表的创建:
SELECT PERSOANA_ID, Count(*) As total FROM ( -- 把原中间表的查询逻辑作为子查询,和CERINTA4的关联写法一致 SELECT proprietate.PERSOANA_ID, proprietate.NR_VEHICUL FROM proprietate INNER JOIN vehicul ON proprietate.NR_VEHICUL=vehicul.NR_VEHICUL ) AS prop2veh Group By PERSOANA_ID Having Count(*) > 2;
这个写法完全复用了CERINTA4的“直接关联查询”模式,既避免了语法错误,还省去了创建中间表的额外开销。
错误原因补充
CREATE TABLE ... AS SELECT是ANSI SQL标准写法,但SQL Server并未实现该语法,它用SELECT ... INTO来完成“从查询结果创建新表”的功能。错误提示里的Expecting EDGE_TYPE or ID是SQL Server解析器对语法结构的误判,本质是不识别CREATE TABLE ... AS的写法。
内容的提问来源于stack exchange,提问作者Mihail
相关产品推荐
相关产品推荐

