创建ec_recurring表时enum与cast附近语法错误的原因咨询
问题分析与解决方案
从你给出的错误提示Msg 102, Level 15, State 1可以判断,你是在SQL Server环境中执行这段原本为MySQL编写的SQL代码,这就是语法错误的核心原因——两种数据库的语法规则不兼容,具体问题出在以下两点:
1. enum类型是MySQL专属,SQL Server不支持
你代码里的enum('day','week','semi_month','month','year')是MySQL特有的枚举类型,但SQL Server并没有这个数据类型。当SQL Server解析到enum后的'day'时,无法识别这个语法,直接抛出了语法错误。
修正方案:
可以用varchar类型配合CHECK约束来实现枚举的效果,比如:
[frequency] varchar(20) NOT NULL CHECK ([frequency] IN ('day','week','semi_month','month','year'))
2. cast(10 as int) unsigned的语法完全错误
这段写法存在两个问题:
unsigned是MySQL中整数类型的修饰符,SQL Server不支持无符号整数类型(如果需要限制为正整数,可以用CHECK约束实现);cast(10 as int)是用来转换值的函数,不能用来定义列的数据类型——你想要的应该是指定列的整数长度,在SQL Server中直接写int(或tinyint/smallint根据实际需求)即可,不需要用cast。
修正方案:
把类似[duration] cast(10 as int) unsigned NOT NULL的代码改成:
[duration] int NOT NULL CHECK ([duration] > 0)
如果需要更小的整数范围,也可以用tinyint(0-255)或smallint(-32768到32767),配合CHECK约束确保为正整数。
修正后的完整SQL示例(适配SQL Server)
CREATE TABLE ec_recurring ( [recurring id] int NOT NULL IDENTITY, [price] decimal(10,4) NOT NULL, [frequency] varchar(20) NOT NULL CHECK ([frequency] IN ('day','week','semi_month','month','year')), [duration] int NOT NULL CHECK ([duration] > 0), [cycle] int NOT NULL CHECK ([cycle] > 0), [trial status] tinyint(4) NOT NULL, [trial price] decimal(10,4) NOT NULL, [trial frequency] varchar(20) NOT NULL CHECK ([trial frequency] IN ('day','week','semi_month','month','year')), [trial duration] int NOT NULL CHECK ([trial duration] > 0), [trial cycle] int NOT NULL CHECK ([trial cycle] > 0), [status] tinyint(4) NOT NULL, [sort order] int NOT NULL, [date created] datetime2 NOT NULL, [date modified] datetime2 NOT NULL, [created by] varchar(20) NOT NULL, [modified by] varchar(20) NOT NULL, [active] tinyint(4) NOT NULL, PRIMARY KEY ([recurring id]) );
(注:SQL Server不支持ENGINE=MyISAM和AUTO_INCREMENT(用IDENTITY替代),CHARSET=utf8也不需要,SQL Server默认编码适配需求)
内容的提问来源于stack exchange,提问作者Vino Thini
相关产品推荐
相关产品推荐

