Condividi tramite


Problemi di denominazione T-SQL

Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure database SQL in Microsoft Fabric

Quando si analizza il codice T-SQL nel progetto di database, uno o più avvisi potrebbero essere classificati come problemi di denominazione. È consigliabile risolvere i problemi di denominazione per evitare le situazioni seguenti:

  • Il nome specificato per un oggetto potrebbe essere in conflitto con il nome di un oggetto di sistema.
  • Il nome specificato deve essere sempre racchiuso tra caratteri di escape (in SQL Server, '[' e ']').
  • Il nome specificato potrebbe confondere altri utenti che tentano di leggere e comprendere il codice.
  • Il codice potrebbe interrompersi se viene eseguito con le versioni future di SQL Server.

In generale, è possibile eliminare un problema di denominazione se altre applicazioni che non è possibile modificare dipendono dal nome corrente.

Le regole fornite identificano i problemi di denominazione seguenti:

SR0011: evitare di usare caratteri speciali nei nomi degli oggetti

Se si assegna un nome a un oggetto di database utilizzando qualsiasi carattere nella tabella seguente, è più difficile non solo fare riferimento a tale oggetto, ma anche leggere il codice contenente il nome dell'oggetto:

Carattere Descrizione
Carattere spazio vuoto
[ Parentesi quadra sinistra
] Parentesi quadra destra
' Virgoletta singola
" Virgolette doppie

Come correggere le violazioni

Per risolvere questo problema, è necessario rimuovere tutti i caratteri speciali dal nome dell'oggetto. Se si fa riferimento all'oggetto in altri percorsi del progetto di database, ad esempio negli unit test del database, è consigliabile usare il refactoring del database per aggiornare i riferimenti. Per altre informazioni, vedere Rinominare tutti i riferimenti a un oggetto di database.

Esempio

Nel primo esempio una tabella contiene una colonna con un carattere speciale nel nome. Nel secondo esempio il nome non contiene un carattere speciale.

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: evitare di usare parole riservate per i nomi dei tipi

È consigliabile evitare di usare una parola riservata come nome di un tipo definito dall'utente perché i lettori hanno un tempo più difficile per comprendere il codice del database. È possibile usare parole riservate in SQL Server come identificatori e nomi di oggetto solo se si usano identificatori delimitati. Per altre informazioni, vedere l'elenco completo delle parole chiave riservate.

Come correggere le violazioni

È necessario rinominare il tipo o il nome dell'oggetto definito dall'utente.

Esempio

Il primo esempio mostra la definizione di un tipo definito dall'utente che attiva questo avviso. Il secondo esempio mostra un modo per correggere il tipo definito dall'utente e risolvere il 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: evitare di usare sp_ come prefisso per le stored procedure

In SQL Server il prefisso sp_ designa le stored procedure di sistema. Se si utilizza tale prefisso per le stored procedure, il nome della stored procedure potrebbe essere in conflitto con il nome di una stored procedure di sistema che verrà creata in futuro. Se si verifica un conflitto di questo tipo, l'applicazione potrebbe interrompersi se l'applicazione fa riferimento alla procedura senza qualificare il riferimento in base allo schema. In questo caso, il nome viene associato alla routine di sistema anziché alla routine.

Come correggere le violazioni

Per risolvere questo problema, è necessario sostituire sp_ con un prefisso diverso per designare le stored procedure utente oppure non è necessario usare alcun prefisso.

Esempio

Nel primo esempio, il nome della routine fa sì che venga generato questo avviso. Nel secondo esempio la routine usa un prefisso usp_ anziché sp_ ed evitare l'avviso.

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