Copia di dati tra regole di confronto diverse

In Microsoft SQL Server lo spostamento di dati tra colonne Unicode non richiede alcuna conversione. Per lo spostamento tra colonne contenenti dati di tipo carattere non Unicode, al contrario, è necessaria la conversione dalla tabella codici della colonna di origine alla tabella codici di quella di destinazione. Una tabella codici è un set ordinato di caratteri di un dato alfabeto, nel quale a ogni carattere è associato un indice numerico, o valore di punto di codice. Le tabelle codici supportano i set di caratteri e i layout di tastiera utilizzati da diverse impostazioni locali di Microsoft Windows. Per un elenco delle tabelle codici supportate, vedere Architettura delle tabelle codici.

Per impostazione predefinita, i dati di tipo carattere vengono convertiti come illustrato di seguito:

Operazione

Dati di tipo carattere convertiti in:

Esportazione

Caratteri della tabella codici OEM

Importazione

Caratteri della tabella codici ANSI/Microsoft Windows

La conversione tra tabelle codici OEM e ANSI provoca la perdita di caratteri estesi e DBCS (Double-Byte Character Set). Per evitare questo tipo di conversioni in SQL Server è possibile specificare una tabella codici o una regola di confronto.

[!NOTA]

Per informazioni sul trasferimento di un database da un set di regole di confronto a un altro, vedere questo sito Web Microsoft.

In SQL Server 7.0 e versioni successive, l'archiviazione fisica delle stringhe di caratteri viene controllata dalle regole di confronto. L'impostazione di regole di confronto è supportata a quattro livelli: l'istanza del server, un database, una colonna di tabella e un'espressione. Un set di regole di confronto specifica tre proprietà:

  • La tabella codici utilizzata per archiviare dati di tipo carattere non Unicode.

  • Il tipo di ordinamento da utilizzare per i tipi di dati Unicode nchar, nvarchar e ntext. Il tipo di ordinamento definisce la sequenza in cui vengono ordinati i caratteri e il metodo di valutazione dei caratteri nelle operazioni di confronto.

  • Il tipo di ordinamento da utilizzare per i tipi di dati carattere non Unicode char, varchar e text.

[!NOTA]

In base a Microsoft è preferibile specificare un nome delle regole di confronto per ogni colonna in un file di formato.

Per informazioni generali sulle tabelle codici e le regole di confronto, vedere Regole di confronto e supporto Unicode. Per informazioni più dettagliate, vedere Utilizzo delle regole di confronto.

Utilizzo di regole di confronto a livello di colonna

In SQL Server 7.0 e versioni successive è possibile controllare la conversione dei dati specificando le regole di confronto con le quali sono archiviati i dati nel campo del file di dati di destinazione, per un'esportazione bulk, oppure la colonna della tabella di destinazione, per un'operazione di importazione bulk. Tutte le conversioni necessarie, dalle regole di confronto del file di dati a quelle delle colonne della tabella del database, vengono eseguite internamente all'operazione di importazione o esportazione.

[!NOTA]

SQL Server 7.0 e versioni successive supportano la specifica di una tabella codici, ma è preferibile specificare le regole di confronto in un file di formato.

Le regole di confronto vengono sempre applicate alle colonne SQLCHAR, sia per le importazioni che per le esportazioni bulk. Le specifiche delle regole di confronto a livello di colonna vengono sempre ignorate per le colonne con un tipo di dati host diverso da SQLCHAR o SQLNCHAR. Le regole di confronto vengono utilizzate per determinare il tipo di ordinamento delle colonne SQLCHAR e SQLNCHAR durante le operazioni di importazione bulk in cui nell'hint ORDER viene fatto riferimento alle colonne.

Per specificare le regole di confronto è necessario utilizzare un file di formato. Entrambi i tipi di file di formato supportano l'impostazione di regole di confronto a livello di colonna. Per informazioni sull'utilizzo di regole di confronto in file di formato non XML vedere la sezione seguente, Impostazione di regole di confronto a livello di colonna in file di formato non XML. Per informazioni sull'utilizzo delle regole di confronto in file di formato XML, vedere Informazioni sui file di formato XML.

Impostazione di regole di confronto a livello di colonna in file di formato non XML

La colonna finale di un file di formato non XML, ovvero la colonna nella posizione ordinale 8, contiene regole di confronto che specificano le modalità di archiviazione dei dati della colonna nel file di dati. Sono disponibili le opzioni seguenti:

Opzione

Descrizione

name

Specifica il nome del set di regole di confronto utilizzato per archiviare i dati nel file di dati. Per un elenco dei nomi delle regole di confronto SQL, vedere Nome delle regole di confronto di SQL Server (Transact-SQL).

RAW

Specifica che i dati vengono archiviati con la tabella codici definita in un'opzione di tabella codici nel comando o nell'hint BCPFILECP di bcp_control. Se non viene specificata alcuna opzione, per il file di dati verranno utilizzate le regole di confronto della tabella codici OEM del computer client.

NotaNota
Per ulteriori informazioni sulle opzioni di tabella codici, vedere "Utilizzo di una tabella codici" di seguito in questo argomento. Per ulteriori informazioni sull'hint BCPFILECP, vedere bcp_control.

""

Questa impostazione ha la stessa funzione di RAW.

Esempi

Nell'esempio seguente viene illustrato un file di formato non XML con regole di confronto a livello di colonna specificate per i campi 2 e 3. Le informazioni sulle regole di confronto vengono visualizzate in grassetto.

9.0
4
1       SQLCHAR       0       7       "\t"     1     DepartmentID     ""
2       SQLCHAR       0       100     "\t"     2     Name             SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR       0       100     "\t"     3     GroupName        SQL_Latin1_General_CP1_CI_AS
4       SQLCHAR       0       24      "\r\n"   4     ModifiedDate     ""

[!NOTA]

Il file di formato precedente è relativo alla tabella HumanResources.Department del database di esempio AdventureWorks, che contiene quattro colonne: DepartmentID, Name, GroupName e ModifiedDate. Per ulteriori informazioni sulla tabella, vedere Tabella Department (AdventureWorks).

Per ulteriori informazioni sui file di formato non XML, vedere Informazioni sui file di formato non XML.

Utilizzo di una tabella codici

[!NOTA]

Per controllare la conversione di dati, Microsoft consiglia di utilizzare un file di formato per specificare regole di confronto a livello di colonna per le operazioni di importazione o esportazione bulk. Per ulteriori informazioni, vedere la sezione "Utilizzo di regole di confronto a livello di colonna" più indietro in questo argomento.

La sintassi per specificare una tabella codici è la seguente:

  • Per specificare una tabella codici in un comando bcp, utilizzare l'opzione -C:

    -C { ACP | OEM | RAW | code_page }

  • Per specificare una tabella codici in un'istruzione BULK INSERT o INSERT ... SELECT * FROM OPENROWSET(BULK...), utilizzare l'opzione CODEPAGE:

    CODEPAGE = { **'**ACP '| **'**OEM '| **'**RAW '| 'code_page' }

Sia l'opzione -C che l'opzione CODEPAGE accettano i valori di tabella codici riportati di seguito.

Valore tabella codici

Descrizione

ACP

Durante un'operazione di importazione, specifica che i campi dati del tipo di dati char, varchar o text vengono convertiti dalla tabella codici ANSI/Windows (ISO 1252) alla tabella codici di SQL Server.

Durante un'operazione di esportazione, specifica che l'utilità bcp converte queste colonne dalla tabella codici di SQL Server alla tabella codici ANSI/Windows.

OEM (predefinito)

Durante un'operazione di importazione, specifica che i campi dati del tipo di dati char, varchar o text vengono convertiti dalla tabella codici OEM a quella di SQL Server.

Durante un'operazione di esportazione, specifica che l'utilità bcp converte queste colonne dalla tabella codici di SQL Server alla tabella codici OEM del sistema.

RAW

Non vengono eseguite conversioni tra tabelle codici. Si tratta dell'opzione più rapida.

code_page

Un numero di tabella codici specifico, ad esempio 850. Per un elenco delle tabelle codici supportate, vedere Architettura delle tabelle codici.

Esempi

Negli esempi seguenti viene utilizzata la tabella HumanResources.myTeam del database AdventureWorks. Prima di eseguire gli esempi è necessario creare questa tabella. Per informazioni su come creare la tabella, vedere Creazione della tabella HumanResources.myTeam.

[!NOTA]

Prima di provare l'esempio seguente è necessario eliminare le righe esistenti dalla tabella myTeam per evitare conflitti di chiave primaria.

A. Utilizzo di una tabella codici con bcp

In questo esempio viene utilizzata l'utilità bcp per l'esportazione bulk dei dati dalla tabella HumanResources.myTeam del database AdventureWorks al file di dati myTeam850.txt, utilizzando la tabella codici 850. Al prompt dei comandi di Windows digitare:

bcp AdventureWorks.HumanResources.myTeam out myTeam850.txt -c -C850 -T

B. Utilizzo di una tabella codici con BULK INSERT

In questo esempio viene utilizzata l'istruzione BULK INSERT per l'importazione bulk di myTeam850.txt, creato nel precedente esempio con l'utilità bcp, nella tabella HumanResources.myTeam di AdventureWorks.

Da uno strumento per le query, come l'editor di query di SQL Server Management Studio, eseguire:

USE AdventureWorks
GO
DELETE HumanResources.myTeam
GO
BULK INSERT HumanResources.myTeam 
   FROM 'C:\myTeam850.txt'
   WITH (CODEPAGE = 850);
GO

Esportazione bulk di dati tra regole di confronto diverse

In un'operazione di esportazione bulk, le regole di confronto specificate controllano la tabella codici utilizzata per archiviare i dati di tipo carattere nel file di dati. Le regole vengono applicate a:

  • Tutte le colonne di un file di dati in formato carattere.

  • Tutte le colonne di un file in modalità nativa nelle quali SQLCHAR è specificato come tipo di dati del file host.

  • Tutti i caratteri SQLCHAR i cui valori sono maggiori di 127 o minori di 32.

    L'applicazione di regole di confronto diverse non ha alcun effetto sui caratteri i cui valori sono compresi tra 32 e 127 in quanto, sebbene le regole vengano applicate anche a questi, tutte le tabelle codici mappano gli stessi caratteri ai valori compresi tra 32 e 127.

Le regole per determinare il set di regole di confronto o la tabella codici da utilizzare in un'operazione di esportazione bulk sono le seguenti:

  • Se vengono specificate regole di confronto a livello di colonna in un file di formato o utilizzando la funzione ODBC bcp_setcolfmt (bcp_setcolfmt), i dati di tipo carattere vengono archiviati utilizzando la tabella codici ANSI associata a tali regole.

  • Se non sono state impostate regole di confronto a livello di colonna, ma è stata specificata una tabella codici mediante un'opzione di tabella codici nel comando o l'hint BCPFILECP di bcp_control, tutti i dati SQLCHAR delle colonne per le quali non sono state specificate regole di confronto vengono archiviati utilizzando la tabella codici specificata.

    [!NOTA]

    Per informazioni sulle opzioni di tabella codici, vedere Utilizzo di una tabella codici più indietro in questo argomento. Per ulteriori informazioni sull'hint BCPFILECP, vedere bcp_control.

  • Se non si specificano regole di confronto o una tabella codici, i dati SQLCHAR vengono archiviati utilizzando la tabella codici OEM del computer client.

[!NOTA]

Nei file di dati non vengono archiviate informazioni relative alle regole di confronto o alla tabella codici.

Importazione bulk di dati tra regole di confronto diverse

Quando viene eseguita un'operazione di importazione bulk, l'interpretazione della tabella codici riguarda soltanto le colonne archiviate come dati in formato carattere, SQLCHAR, in un file di dati. In un file di dati in formato carattere tutte le colonne vengono archiviate come SQLCHAR. Poiché nei file di dati non vengono archiviate informazioni relative alle regole di confronto o alla tabella codici, per un'operazione di importazione bulk è necessario fornire tali informazioni per i campi dati.

Le regole per determinare il set di regole di confronto o la tabella codici da utilizzare in un'operazione di importazione bulk sono le seguenti:

  • Se vengono specificate regole di confronto a livello di colonna in un file di formato o utilizzando la funzione bcp_setcolfmt di ODBC (bcp_setcolfmt), i dati SQLCHAR di un file di dati vengono interpretati in base alla tabella codici ANSI associata alle regole specificate. Assicurarsi che le regole di confronto impostate corrispondano a quelle presenti nel file di dati.

  • Se non vengono specificate regole di confronto a livello di colonna, ma viene specificata una tabella codici utilizzando l'opzione di tabella codici nel comando o l'hint BCPFILECP di bcp_control, i dati SQLCHAR vengono interpretati in base alla tabella codici specificata.

    [!NOTA]

    Per ulteriori informazioni sulle opzioni di tabella codici, vedere Utilizzo di una tabella codici più indietro in questo argomento. Per ulteriori informazioni sull'hint BCPFILECP, vedere bcp_control.

  • Se non si specificano regole di confronto o una tabella codici, i dati nelle colonne SQLCHAR vengono interpretati utilizzando la tabella codici OEM del computer client.

Quando viene eseguita un'operazione di importazione bulk, le impostazioni delle regole di confronto consentono di controllare:

  • L'interpretazione della tabella codici delle colonne SQLCHAR nel file di dati.

  • L'applicazione dell'hint ORDER da parte di bcp o BULK INSERT, se specificato.

    Se si utilizza l'hint ORDER, nell'operazione di importazione bulk le regole di confronto consentono la corretta interpretazione dell'hint. L'hint viene applicato alle colonne SQLCHAR e SQLNCHAR. La sequenza dei dati nelle colonne a cui fa riferimento un hint ORDER deve corrispondere a quella definita dalle regole di confronto assegnate a tali colonne. Per ulteriori informazioni, vedere Controllo dell'ordinamento durante l'importazione bulk di dati.