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