SQL Server中DATEPART函数的"yy"与yy的区别及引号用法疑问
在SQL Server中DATEPART参数的引号使用与双引号的特殊用途
嘿,这个细节问题问得好!我来给你理清楚SQL Server里双引号的作用,以及DATEPART的规范写法:
双引号在SQL Server里的特殊用途
在SQL Server中,双引号的行为主要由会话级设置QUOTED_IDENTIFIER控制:
- 当
QUOTED_IDENTIFIER = ON(这是默认设置):双引号被当作分隔标识符使用,用来包裹那些不符合常规标识符规则的对象名(比如包含空格、特殊字符,或者和SQL保留字重名的表/列名)。举个例子:-- 当表名有空格时,用双引号(或方括号)包裹才能正常访问 SELECT * FROM "Sales Data"; - 当
QUOTED_IDENTIFIER = OFF:双引号的作用和单引号完全一样,用来包裹字符串常量。
你测试的DATEPART("yy", GETDATE())能运行,是因为yy是合法的标识符,当QUOTED_IDENTIFIER为ON时,双引号包裹的"yy"被识别为标识符,和直接写yy效果一致;就算设置为OFF,"yy"会被当作字符串常量,DATEPART也能正常解析这个参数。
DATEPART的规范写法
SQL Server官方推荐的DATEPART参数写法有两种:
- 直接使用不带引号的标识符:这是最简洁也最常用的写法,比如:
SELECT DATEPART(yy, GETDATE()); SELECT DATEPART(year, GETDATE()); -- 用完整单词也可以 - 使用单引号包裹的字符串常量:这种写法也符合规范,可读性也不错:
SELECT DATEPART('yy', GETDATE()); SELECT DATEPART('year', GETDATE());
至于双引号的写法,虽然能运行,但不推荐作为规范写法:
- 它的行为依赖
QUOTED_IDENTIFIER设置,一旦这个设置被修改(比如某些工具或脚本会手动调整),虽然DATEPART场景下可能不会出错,但养成这种习惯会增加其他场景的潜在风险(比如处理对象名时)。 - 相比之下,方括号
[]是SQL Server里更通用的分隔标识符写法,比双引号的兼容性更好,也更符合大多数SQL Server开发者的习惯。
内容的提问来源于stack exchange,提问作者shaair
相关产品推荐
相关产品推荐

