SQL执行CREATE TABLE AS语句报错无法生成新表如何解决
错误原因
你遇到的Incorrect syntax near '('报错核心原因是SQL Server 不支持CREATE TABLE 表名 AS (SELECT ...)的建表语法:该语法是MySQL、PostgreSQL、Oracle等数据库的标准写法,SQL Server中对应的「查询结果直接生成新表」语法为SELECT ... INTO 新表名 FROM 数据源,因此解析器读到SELECT外层的括号时就会抛出语法错误,和你预判的出错位置一致。
另外你原代码中给新表命名为[Table]属于使用系统保留关键字,即使加方括号可以绕过语法校验,后续查询、维护都很容易出问题,建议替换为有业务含义的表名。
修正后可直接运行的代码
-- 为原表添加逐行折现率计算列 alter table dbo.[DBO] add scalar as power(0.95,(9 + cast([rowno] as float))/12); -- 按ID分组计算现值并生成新结果表 select ID, sum([Column I] * scalar) as newI, sum([Column J] * scalar) as newJ into dbo.DBO_PresentValue -- 替换为你需要的业务表名,不要使用保留字Table from dbo.[DBO] group by ID;
可选替代方案
如果你需要提前定义新表的字段类型、约束、索引,可以使用先建表再插入数据的写法,灵活性更高:
-- 提前创建结果表结构,字段类型、约束可根据业务需求自定义 create table dbo.DBO_PresentValue ( ID int not null, newI decimal(20,6), newJ decimal(20,6), constraint PK_DBO_PresentValue primary key clustered (ID) ); -- 插入计算完成的现值数据 insert into dbo.DBO_PresentValue (ID, newI, newJ) select ID, sum([Column I] * scalar) as newI, sum([Column J] * scalar) as newJ from dbo.[DBO] group by ID;
补充说明
- 你原代码中添加的
scalar计算列为逐行计算的折现系数,配合sum(列 * scalar)按ID分组求和的逻辑符合现值计算要求,这部分不需要调整。 - 如果不需要永久在原表保留
scalar计算列,也可以把折现率计算逻辑直接写到SELECT语句中,避免修改原表结构。
内容的提问来源于stack exchange,提问作者Noë
相关产品推荐
相关产品推荐

