Scrittura di istruzioni Transact-SQL internazionali

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsPiattaforma di strumenti analitici (PDW)

Le linee guida seguenti consentono di aumentare il grado di portabilità tra lingue diverse, nonché il supporto di più lingue, per i database e le applicazioni di database che usano istruzioni Transact-SQL:

  • A partire da SQL Server 2019 (15.x) e in Database SQL di Azure, usare:

    • I tipi di dati char, varchar e varchar(max) con le regole di confronto abilitate per UTF-8 e i dati codificati con UTF-8.
    • I tipi di dati nchar, nvarchar e nvarchar(max) con le regole di confronto abilitate per caratteri supplementari (SC) e i dati codificati con UTF-16. L'uso di regole di confronto non SC comporta la codifica dei dati con UCS-2.

    In questo modo si evitano problemi di conversione della tabella codici. Per altre considerazioni, vedere Differenze nell'archiviazione tra UTF-8 e UTF-16.

  • Fino a SQL Server 2017 (14.x) sostituire tutte le occorrenze dei tipi di dati char, varchar e varchar(max) con nchar, nvarchar e nvarchar(max). Se si usano regole di confronto abilitate per caratteri supplementari (SC), i dati vengono codificati con UTF-16. L'uso di regole di confronto non SC comporta la codifica dei dati con UCS-2. In questo modo si evitano problemi di conversione della tabella codici. Per ulteriori informazioni, vedi Supporto per Unicode e regole di confronto.

    Importante

    Il tipo di dati text è deprecato e non deve essere usato in nuovi progetti di sviluppo. Pianificare la conversione dei dati text al tipo di dati varchar(max).

  • Quando si eseguono confronti e operazioni con mesi o giorni della settimana, usare le parti numeriche della data invece delle stringhe di nomi. I nomi dei mesi e dei giorni della settimana restituiti variano a seconda dell'impostazione della lingua. Ad esempio, DATENAME(MONTH,GETDATE()) restituisce May quando la lingua è impostata sull'inglese (Stati Uniti), Mai se è impostata sul tedesco e mai se è impostata sul francese. Specificare quindi una funzione quale DATEPART che usa il numero invece del nome del mese. Utilizzare i nomi DATEPART quando si compilano i set di risultati da visualizzare all'utente, in quanto le stringhe di nomi sono più significative delle parti numeriche. Non creare tuttavia il codice di logica che dipende dai nomi visualizzati di una lingua specifica.

  • Quando si specificano le date nei confronti o nell'input di istruzioni INSERT e UPDATE, utilizzare costanti che vengono interpretate nello stesso modo indipendentemente dall'impostazione della lingua:

    • Le applicazioni ADO, OLE DB e ODBC devono utilizzare le clausole di escape seguenti relative a timestamp, data e ora:

      { ts'aaaa-mm-gghh:mm:ss [.fff] '}, ad esempio: { ts'1998-09-24 10:02:20'}

      { d'aaaa-mm-gg'} ad esempio: { d'1998-09-24'}

      { t'hh:mm:ss'} ad esempio: { t'10:02:20'}

    • Nelle applicazioni che usano altre API, oppure script, stored procedure e trigger di Transact-SQL, è necessario usare le stringhe numeriche non separate. Ad esempio, aaaammgg come 19980924.

    • Nelle applicazioni che usano altre API oppure script, stored procedure e trigger di Transact-SQL è anche possibile usare l'istruzione CONVERT con un parametro di stile esplicito per tutte le conversioni tra i tipi di dati time, date, smalldate, datetime, datetime2 e datetimeoffset e i tipi di dati stringa di caratteri. L'istruzione seguente viene interpretata nello stesso modo indipendentemente dalle impostazioni di connessione della lingua o del formato della data:

      SELECT *  
      FROM AdventureWorks2022.Sales.SalesOrderHeader  
      WHERE OrderDate = CONVERT(DATETIME, '20060719', 101)  
      

Vedi anche

CAST e CONVERT (Transact-SQL)
DATEPART (Transact-SQL)
Regole di confronto e supporto Unicode