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
- SR0012: evite usar palavras reservadas para nomes de tipo
- SR0016: evite usar sp_ como um prefixo para procedimentos armazenados
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