T-SQL 命名问题
适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Microsoft Fabric SQL 数据库
在数据库项目中分析 T-SQL 代码时,可能会将一个或多个警告归类为命名问题。 应解决命名问题,以避免出现以下情况:
- 为对象指定的名称可能与系统对象的名称冲突。
- 指定的名称始终需要用转义字符(在 SQL Server 中为 '[' 和 ']')括起来。
- 指定的名称可能会使尝试阅读和理解代码的其他人感到困惑。
- 如果使用 SQL Server 的未来版本运行代码,则代码可能会中断。
通常,如果其他无法更改的应用程序依赖于当前名称,则可能会抑制命名问题。
提供的规则将确定以下命名问题:
SR0011:避免在对象名称中使用特殊字符
如果使用下表中的任何字符命名数据库对象,则不仅使引用对象变得更加困难,而且使读取包含该对象名称的代码也变得更加困难:
字符 | 说明 |
---|---|
|
空格字符 |
[ |
左方括号 |
] |
右方括号 |
' |
单引号 |
" |
双引号 |
如何解决冲突
若要解决此问题,必须从对象名称中移除所有特殊字符。 如果对象在数据库项目的其他位置(例如在数据库单元测试中)中引用,则应使用数据库重构来更新引用。 有关详细信息,请参阅“重命名对数据库对象的所有引用”。
示例
在第一个示例中,表包含一个名称中具有特殊字符的列。 在第二个示例中,名称不包含特殊字符。
CREATE TABLE [dbo].[TableWithProblemColumn]
(
[ID] INT NOT NULL IDENTITY(0, 1),
[Small'String] VARCHAR(10)
)
ON [PRIMARY]
CREATE TABLE [dbo].[FixedTable]
(
[ID] INT NOT NULL IDENTITY(0, 1),
[SmallString] VARCHAR(10)
)
ON [PRIMARY]
SR0012:避免对类型名称使用保留字
应避免使用保留字作为用户定义类型的名称,因为读者很难理解你的数据库代码。 只有在使用分隔标识符时,才能在 SQL Server 中使用保留字作为标识符和对象名称。 有关详细信息,请参阅保留字的完整列表。
如何解决冲突
必须重命名用户定义的类型或对象名称。
示例
第一个示例显示触发此警告的用户定义类型的定义。 第二个示例显示更正用户定义的类型并解决问题的一种方法。
-- Potential misuse of a keyword as a type name
CREATE TYPE Alter
FROM nvarchar(11) NOT NULL;
-- Corrected type name
CREATE TYPE AlterType
FROM nvarchar(11) NOT NULL;
SR0016:避免将 sp_ as 用作存储过程的前缀
在 SQL Server 中,sp_
前缀指定系统存储过程。 如果将该前缀用于存储过程,则过程的名称可能与未来将创建的系统存储过程的名称冲突。 如果发生此类冲突,若应用程序引用过程而不按架构限定引用,则应用程序可能会中断。 在这种情况下,名称将绑定到系统过程,而不是绑定到你的过程。
如何解决冲突
若要解决此问题,必须将 sp_
替换为另一个前缀来指定用户存储过程,或者根本不使用任何前缀。
示例
在第一个示例中,过程名称会导致发出此警告。 在第二个示例中,该过程使用 usp_
前缀而不是 sp_
并且会避免警告。
CREATE PROCEDURE [dbo].[sp_procWithWarning]
(
@Value1 INT,
)
AS
BEGIN
-- Additional statements here
RETURN 0;
END
CREATE PROCEDURE [dbo].[usp_procFixed]
(
@Value1 INT,
)
AS
BEGIN
-- Additional statements here
RETURN 0;
END