sql-server - SQL Server 数据库名称中哪些字符有效?

标签 sql-server tsql identifier

我们将为客户提供一个工具(除其他外)创建新的 SQL Server 数据库,并且我希望能够对他们提供的数据库名称进行基本验证。 SQL Server 的文档解释了数据库名称中哪些字符是有效的。但是,文档显然不正确,因为我可以成功创建名称违反文档规则的数据库。

根据 SQL Server 的文档 CREATE DATABASE 、数据库名称必须符合标识符规则;以及 identifiers 的规则取决于数据库兼容性级别。当兼容性级别为 100(根据 SQL Server Management Studio,这意味着“SQL Server 2008”)时,名称必须以 Unicode 字母、_@ 开头,或#;后跟一个或多个字母、数字、@$#_。文档明确指出不允许嵌入空格或特殊字符。

这与现有证据背道而驰,因为我可以使用 SQL Server Management Studio 创建一个名为 This & That | 的数据库。 “Other”——不仅包含嵌入的空格(明确禁止),还包含甚至在以下环境中无效的特殊字符(|")一个文件名。我检查过,数据库的兼容级别确实是“SQL Server 2008 (100)”,尽管它的名称被记录为在该兼容级别上无效。

哎呀,我什至可以CREATE DATABASE ""(是的,这是一个空格),这证明第一个字符不必必须是字母,下划线、at 符号或井号。

所以我想我的问题是,哪些字符在 SQL Server 数据库名称中有效?是否有任何与 SQL Server 实际行为一致的记录规则?

最佳答案

rules for identifiers最后声明:

When identifiers are used in Transact-SQL statements, the identifiers that do not comply with these rules must be delimited by double quotation marks or brackets.

通过选择不符合这些规则的数据库名称,您必须始终用双引号或方括号将其括起来。

如果遵守常规标识符的规则,您可以使用不带引号/括号的数据库名称。

下面的指令就可以了

CREATE DATABASE [conformingName]
CREATE DATABASE conformingName
CREATE DATABASE [This & That | "Other"]

但不是

CREATE DATABASE This & That | "Other"

编辑:

我同意这不是人们理解链接文档的方式:如果一旦包含标识符,规则就不再适用,那么必须遵守标识符规则意味着什么?关于包含不合格标识符的要点应该成为规则的一部分。

关于sql-server - SQL Server 数据库名称中哪些字符有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4200351/

相关文章:

sql-server - 将两个 xml 片段合并为一个?

c++ - 错误CC2061 : syntax error: identifier 'GLUquadric'

sql-server - SQL Server 2005/2008 : Identify current user

mysql - 如何在 select 语句中生成条件数字列

SQL 查找相同的组

sql-server - SQL Server 2014执行计划创建需要很长时间(旧版本很快)

c - 将标识符和类型传递给宏

php - 如何生成与给定模式匹配的随机唯一标识符

javascript - NPM MSSQL - 错误 : uncaughtException: Cannot read property 'release' of null

sql - T-SQL解析XML赋予空白值