Partilhar via


Problemas de nomenclatura do T-SQL

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Banco de dados SQL no Microsoft Fabric

Quando você analisa o código T-SQL em seu projeto de banco de dados, um ou mais avisos podem ser categorizados como problemas de nomenclatura. Você deve resolver problemas de nomenclatura para evitar as seguintes situações:

  • O nome especificado para um objeto pode entrar em conflito com o nome de um objeto do sistema.
  • O nome que você especificou sempre precisa ser colocado entre caracteres de escape (no SQL Server, ''['' e '']'').
  • O nome que você especificou pode confundir outras pessoas que tentam ler e entender seu código.
  • O código pode ser desfeito se você executá-lo com versões futuras do SQL Server.

Em geral, você pode suprimir um problema de nomenclatura se outros aplicativos que você não pode alterar dependerem do nome atual.

As regras fornecidas identificam os seguintes problemas de nomenclatura:

SR0011: evite usar caracteres especiais em nomes de objetos

Se você nomear um objeto de banco de dados usando qualquer caractere na tabela a seguir, tornará mais difícil não apenas fazer referência a esse objeto, mas também ler o código que contém o nome desse objeto:

Caractere Descrição
Caractere de espaço em branco
[ Colchete esquerdo
] Colchete direito
' Aspas simples
" Aspas duplas

Como corrigir violações

Para resolver esse problema, você deve remover todos os caracteres especiais do nome do objeto. Se o objeto for referenciado em outros locais em seu projeto de banco de dados (como em testes de unidade de banco de dados), você deverá usar a refatoração de banco de dados para atualizar as referências. Para obter mais informações, consulte Renomear todas as referências a um objeto de banco de dados.

Exemplo

No primeiro exemplo, uma tabela contém uma coluna que tem um caractere especial em seu nome. No segundo exemplo, o nome não contém um caractere especial.

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: evite usar palavras reservadas para nomes de tipo

Você deve evitar usar uma palavra reservada como o nome de um tipo definido pelo usuário porque os leitores têm mais dificuldade em entender o código do banco de dados. Você pode usar palavras reservadas no SQL Server como identificadores e nomes de objeto somente se usar identificadores delimitados. Para obter mais informações, consulte a lista completa de palavras-chave reservadas.

Como corrigir violações

Você deve renomear o tipo definido pelo usuário ou o nome do objeto.

Exemplo

O primeiro exemplo mostra a definição de um tipo definido pelo usuário que dispara esse aviso. O segundo exemplo mostra uma maneira de corrigir o tipo definido pelo usuário e resolver o problema.

-- 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: evite usar sp_ como um prefixo para procedimentos armazenados

No SQL Server, o prefixo sp_ designa procedimentos armazenados do sistema. Se você usar esse prefixo para seus procedimentos armazenados, o nome do procedimento poderá entrar em conflito com o nome de um procedimento armazenado do sistema que será criado no futuro. Se esse conflito ocorrer, seu aplicativo poderá apresentar problemas se o aplicativo se referir ao procedimento sem qualificar a referência por esquema. Nessa situação, o nome é associado ao procedimento do sistema em vez de ao procedimento.

Como corrigir violações

Para resolver esse problema, você deve substituir sp_ por um prefixo diferente para designar procedimentos armazenados do usuário ou não deve usar nenhum prefixo.

Exemplo

No primeiro exemplo, o nome do procedimento faz com que esse aviso seja emitido. No segundo exemplo, o procedimento usa um prefixo usp_ em vez de sp_ e evita o aviso.

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