我们将为客户提供一个工具(除其他外)创建新的 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 实际行为一致的记录规则?
最佳答案
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/