SQL Server列默认值语法疑问:双括号及写法合规性咨询
嗨John,关于你在使用Visual Studio 2012表设计器给SQL Server 2012表添加默认值时遇到的双括号问题,我来逐个解答你的疑问:
问题1:为何会出现双括号“((值))”?
这其实是Visual Studio表设计器的生成逻辑导致的小冗余。设计器在处理默认值时,会把所有默认值都当作表达式来处理——哪怕你输入的是一个简单常量,它也会先把常量用单括号包裹成一个表达式(比如('1980-01-01')),然后再在外层多套一层括号。这么做没有特殊的技术必要性,只是设计器的标准化生成习惯,确保不管是常量还是复杂表达式(比如GETDATE()),都能统一用表达式的格式输出。
问题2:语法是否要求必须使用双括号?
完全不需要!SQL Server的语法对DEFAULT子句的要求很灵活:
- 你可以直接写常量,比如
DEFAULT '1980-01-01' - 也可以用单括号包裹表达式,比如
DEFAULT ('1980-01-01') - 双括号属于多余的写法,但因为SQL允许嵌套括号来明确优先级(哪怕这里优先级完全不影响),所以也不会报错,只是没必要。
问题3:使用DEFAULT '1980-01-01' NULL;这类写法是否可行?
当然可行!而且这是更简洁、更符合常规写法的方式。只要你指定的常量类型和列的类型匹配(这里DATE类型能自动隐式转换字符串'1980-01-01'),直接写常量就完全没问题。后面的NULL是声明该列允许为空,这个写法完全符合SQL Server 2012的语法,执行效果和带双括号的版本完全一致。
举个例子,以下几种写法都是合法且等价的:
- 设计器生成的冗余写法:
ALTER TABLE [dbo].[tVEHICLES] ADD [DT_ACTIVE_EVENT] DATE DEFAULT (('1980-01-01')) NULL; - 简化的单括号写法:
ALTER TABLE [dbo].[tVEHICLES] ADD [DT_ACTIVE_EVENT] DATE DEFAULT ('1980-01-01') NULL; - 最简洁的直接常量写法:
ALTER TABLE [dbo].[tVEHICLES] ADD [DT_ACTIVE_EVENT] DATE DEFAULT '1980-01-01' NULL;
内容的提问来源于stack exchange,提问作者John D
相关产品推荐
相关产品推荐

