Condividi tramite


Identificatori di database

Applies to:SQL Serverdatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL analytics endpoint in Microsoft FabricWarehouse in Microsoft FabricSQL database in Microsoft Fabric

Il nome dell'oggetto di database è il relativo identificatore.

Server, database e oggetti di database, come tabelle, viste, colonne, indici, trigger, procedure, vincoli e regole, possono avere identificatori. La maggior parte degli oggetti richiede identificatori, ma alcuni oggetti, ad esempio vincoli, li rendono facoltativi.

Quando si definisce l'oggetto, si crea un identificatore di oggetto. Utilizzare l'identificatore per fare riferimento all'oggetto . Ad esempio, l'istruzione seguente crea una tabella a cui viene associato l'identificatore TableXe due colonne a cui vengono associati gli identificatori KeyCol e Description:

CREATE TABLE TableX
(
    KeyCol INT PRIMARY KEY,
    Description NVARCHAR (80)
);

Questa tabella ha un vincolo senza nome. Il vincolo di chiave primaria non ha un identificatore specificato dall'utente, quindi il sistema assegna un nome generato come PK__TableX__D7CB9CCCEEF0806C. È possibile visualizzare questo nome nelle viste dei metadati di sistema, ad esempio sys.key_constraints.

I nomi dei vincoli e altri oggetti con ambito schema devono essere univoci all'interno di uno schema del database. Ad esempio, due vincoli di chiave primaria non possono condividere un nome. Tuttavia, i nomi delle colonne devono essere univoci solo all'interno di ogni tabella, non all'interno dello schema.

Le regole di confronto di un identificatore dipendono dal livello in cui viene definito.

  • Le regole di confronto predefinite dell'istanza vengono assegnate agli identificatori di oggetti a livello di istanza, ad esempio account di accesso e nomi di database.

  • Le regole di confronto predefinite del database vengono assegnate agli identificatori di oggetti in un database, ad esempio tabelle, viste e nomi di colonna. Ad esempio, è possibile creare due tabelle con nomi diversi solo nel caso in un database con regole di confronto con distinzione tra maiuscole e minuscole, ma non è possibile crearle in un database con regole di confronto senza distinzione tra maiuscole e minuscole.

Note

I nomi delle variabili o dei parametri delle funzioni e delle stored procedure devono essere conformi alle regole per gli identificatori di Transact-SQL.

Classi di identificatori

Esistono due classi di identificatori:

  • Gli identificatori regolari sono conformi alle regole di formato per gli identificatori. Non sono delimitati quando vengono usati nelle istruzioni Transact-SQL. Gli identificatori regolari devono seguire le regole per gli identificatori regolari: possono contenere solo lettere, cifre e determinati simboli (_, @, #, $), devono iniziare con una lettera o una di _, @, #e non possono essere una parola riservata.

    USE AdventureWorks2025;
    GO
    
    SELECT *
    FROM HumanResources.Employee
    WHERE NationalIDNumber = 153479919;
    
  • Gli identificatori delimitati sono racchiusi tra virgolette doppie " o parentesi quadre ([ e ]). I delimitatori consentono di usare nomi che altrimenti non sono validi come identificatori regolari, ad esempio parole chiave riservate, nomi con spazi o nomi con caratteri speciali. Gli identificatori già conformi alle regole di identificatore regolare possono anche essere delimitati, ma i delimitatori sono facoltativi in questo caso. Per altre informazioni, vedere Regole per gli identificatori delimitati.

    USE AdventureWorks2025;
    GO
    
    SELECT *
    FROM [HumanResources].[Employee] --Delimiter is optional.
    WHERE [NationalIDNumber] = 153479919; --Delimiter is optional.
    

Gli identificatori che non sono conformi alle regole per gli identificatori regolari devono essere delimitati in un'istruzione Transact-SQL. Per esempio:

USE AdventureWorks2025;
GO

--Identifier contains a space and uses a reserved keyword.
CREATE TABLE [SalesOrderDetail Table]
(
    [Order] INT NOT NULL,
    [SalesOrderDetailID] INT IDENTITY (1, 1) NOT NULL,
    [OrderQty] SMALLINT NOT NULL,
    [ProductID] INT NOT NULL,
    [UnitPrice] MONEY NOT NULL,
    [UnitPriceDiscount] MONEY NOT NULL,
    [ModifiedDate] DATETIME NOT NULL,
    CONSTRAINT [PK_SalesOrderDetail_Order_SalesOrderDetailID] PRIMARY KEY CLUSTERED
    (
        [Order] ASC,
        [SalesOrderDetailID] ASC
    )
);
GO

SELECT *
FROM [SalesOrderDetail Table] --Identifier contains a space and uses a reserved keyword.
WHERE [Order] = 10; --Identifier is a reserved keyword.

Sia gli identificatori regolari che quelli delimitati devono includere da 1 a 128 caratteri. Gli identificatori delle tabelle temporanee locali possono includere al massimo 116 caratteri.

Regole per gli identificatori delimitati

Gli identificatori delimitati sono racchiusi tra parentesi quadre ([ e ]) o virgolette doppie ("). Possono contenere qualsiasi combinazione di caratteri, inclusi spazi, parole chiave riservate e caratteri speciali che non sono consentiti negli identificatori regolari.

Identificatori delimitati da parentesi quadre

Gli identificatori delimitati da parentesi quadre sono racchiusi tra parentesi quadre ([ e ]). Se l'identificatore stesso contiene una parentesi quadra chiusa (]), eseguire l'escape raddoppiandolo (]]). Una parentesi quadra aperta ([) non richiede l'escape.

Ad esempio, per creare ed eseguire query su una tabella il cui nome contiene parentesi quadre:

-- Create a table with a ] character in its name.
CREATE TABLE [My]]Table]
(
    ID INT PRIMARY KEY
);
GO

-- Reference the table in a query.
SELECT *
FROM [My]]Table];
GO

La QUOTENAME funzione restituisce un identificatore delimitato da parentesi quadre valido per una determinata stringa e gestisce automaticamente l'escape:

SELECT QUOTENAME('abc[]def');

L'esempio precedente restituisce [abc[]]def].

Identificatori delimitati da virgolette doppie

Gli identificatori delimitati da virgolette doppie sono racchiusi tra virgolette doppie ("). Se l'identificatore stesso contiene una virgoletta doppia, eseguire l'escape raddoppiandolo ("").

I delimitatori di virgolette doppie richiedono SET QUOTED_IDENTIFIER ON (impostazione predefinita per la maggior parte delle connessioni). Quando QUOTED_IDENTIFIER è OFF, il motore di database considera le stringhe tra virgolette doppie come valori letterali stringa anziché identificatori. Per altre informazioni, vedere SET QUOTED_IDENTIFIER.

Ad esempio, per creare ed eseguire query su una tabella che usa parole chiave riservate come identificatori:

SET QUOTED_IDENTIFIER ON;
GO

-- Create a table using double-quote delimiters.
CREATE TABLE "My Table"
(
    "Order" INT NOT NULL,
    "Description" NVARCHAR (100)
);
GO

SELECT "Order",
       "Description"
FROM "My Table";
GO

Note

SET QUOTED_IDENTIFIER non influisce sugli identificatori delimitati da parentesi quadre. I delimitatori tra parentesi quadre funzionano sempre indipendentemente dall'impostazione QUOTED_IDENTIFIER .

Regole relative agli identificatori regolari

I nomi di variabili, funzioni e stored procedure devono seguire queste regole per gli identificatori di Transact-SQL.

  1. Il primo carattere deve essere uno dei caratteri seguenti:

    • Una lettera definita dallo standard Unicode 3,2, La definizione Unicode delle lettere include i caratteri dell'alfabeto latino da a a z, da A a Z, e anche i caratteri di altre lingue.

    • Il simbolo underscore (_), la chiocciola (@) o il cancelletto (#).

      Alcuni simboli all'inizio di un identificatore hanno un significato speciale nella motore di database. Un identificatore regolare che inizia con il simbolo della chiocciola indica sempre una variabile locale o un parametro e non può essere utilizzato per il nome di un tipo di oggetto diverso. Un identificatore che inizia con un carattere di numero (#) denota una tabella o procedura temporanea. Un identificatore che inizia con un doppio cancelletto (##) denota un oggetto temporaneo globale. Sebbene sia possibile usare il segno di numero o il segno di numero doppio per iniziare i nomi di altri tipi di oggetti, è consigliabile evitare questa procedura.

      Alcuni funzioni Transact-SQL hanno nomi che iniziano con chioccioline doppie (@@). Per evitare confusione con queste funzioni, non usare nomi che iniziano con @@.

  2. I caratteri successivi possono includere il seguente elenco:

    • Lettere definite nello standard Unicode 3,2.

    • Numeri decimali inclusi nell'alfabeto Latino di base o in altri alfabeti nazionali.

    • Il simbolo di chiocciola (@), il simbolo di dollaro ($), il simbolo di cancelletto (#) o il simbolo tratto basso (_).

  3. L'identificatore non deve essere una parola riservata Transact-SQL. Il motore di database riserva sia le versioni maiuscole che minuscole delle parole riservate. Quando si usano gli identificatori nelle istruzioni Transact-SQL, delimitare quelli che non sono conformi a queste regole utilizzando virgolette doppie o parentesi quadre. Le parole riservate dipendono dal livello di compatibilità del database. Impostare il livello di compatibilità del database utilizzando l'istruzione ALTER DATABASE compatibility level.

  4. Non usare spazi incorporati o caratteri speciali.

  5. Non usare caratteri supplementari.

Quando si usano gli identificatori nelle istruzioni Transact-SQL, delimitare quelli che non sono conformi a queste regole usando le virgolette doppie o le parentesi quadre. Alcune di queste regole variano a seconda del livello di compatibilità del database.

Collaborazione del catalogo in database SQL di Azure

Non è possibile modificare o impostare le regole di confronto del server logico in database SQL di Azure. Tuttavia, è possibile configurare separatamente le regole di confronto di ogni database per i dati nel database e per il catalogo. Le regole di confronto del catalogo determinano le regole di confronto per i metadati di sistema, ad esempio gli identificatori di oggetto. È possibile specificare entrambe le regole di confronto in modo indipendente quando si creare il database nel portale di Azure in Transact-SQL (T-SQL) con CREATE DATABASE o in PowerShell con New-AzSqlDatabase.

Per informazioni dettagliate ed esempi, vedere CREATE DATABASE. Specificare le regole di confronto per il database (COLLATE) e le regole di confronto del catalogo per il sistema e i metadati e gli identificatori di oggetto (CATALOG_COLLATION).

Collazione del catalogo nel database SQL in Microsoft Fabric

Le regole di confronto predefinite di un database SQL in Fabric sono SQL_Latin1_General_CP1_CI_AS. È possibile configurare regole di confronto diverse in fase di distribuzione, ma non modificarle dopo la creazione del database. Le singole colonne possono usare collazioni proprie. Per altre informazioni sulle opzioni di distribuzione, vedere Options per creare un database SQL in Fabric.