Sintassi dello schema per file di formato XML

In questa sezione verrà descritta la sintassi dei file di formato XML. Per informazioni sulla corrispondenza tra la sintassi e i file di formato XML effettivi, vedere File di formato XML di esempio. Viene inoltre esaminato l'utilizzo di elementi <ROW> e <COLUMN> nell'importazione bulk, nonché spiegato come inserire il valore xsi:type di un elemento in un set di dati.

È possibile utilizzare un file di formato XML con un comando bcp, un'istruzione BULK INSERT o INSERT ... SELECT * FROM OPENROWSET(BULK...).

[!NOTA]

   La modifica di un file di formato consente di eseguire l'importazione bulk da un file di dati in cui il numero e/o l'ordine dei campi differisce dal numero e/o dall'ordine delle colonne della tabella. Per ulteriori informazioni, vedere Utilizzo di un file di formato per eseguire il mapping tra campi e colonne durante l'importazione bulk.

Sintassi di base dello schema XML

Nelle istruzioni seguenti sono riportati solo gli elementi (<BCPFORMAT>, <RECORD>, <FIELD>, <ROW> e <COLUMN>) e i relativi attributi di base.

<BCPFORMAT ...>

   <RECORD>

      <FIELD ID = "fieldID" xsi:type = "fieldType" [...]

      />

   </RECORD>

   <ROW>

      <COLUMN SOURCE = "fieldID" NAME = "columnName" xsi:type = "columnType" [...]

      />

   </ROW>

</BCPFORMAT>

[!NOTA]

Gli altri attributi associati al valore di xsi:type in un elemento <FIELD> o <COLUMN> sono descritti più avanti in questo argomento.

Descrizione degli elementi dello schema

In questa sezione viene illustrato brevemente lo scopo di ciascun elemento definito dallo schema XML per i file di formato XML. Gli attributi sono descritti in apposite sezioni più avanti in questo argomento.

  • <BCPFORMAT>
    Corrisponde all'elemento del file di formato che definisce la struttura del record di un file di dati specifico e la relativa corrispondenza con le colonne di una riga della tabella.

  • <RECORD .../>
    Definisce un elemento complesso contenente uno o più elementi <FIELD>. L'ordine con cui i campi vengono dichiarati nel file di formato corrisponde a quello con cui tali campi sono riportati nel file di dati.

  • <FIELD .../>
    Definisce un campo, contenente dati, nel file di dati.

    Per una descrizione degli attributi di questo elemento, vedere "Attributi dell'elemento <FIELD>", più avanti in questo argomento.

  • <ROW .../>
    Definisce un elemento complesso contenente uno o più elementi <COLUMN>. L'ordine degli elementi <COLUMN> è indipendente da quello degli elementi <FIELD> in una definizione RECORD. L'ordine degli elementi <COLUMN> in un file di formato determina invece l'ordine delle colonne del set di righe risultante. I campi di dati vengono caricati nell'ordine con cui vengono dichiarati gli elementi <COLUMN> corrispondenti nell'elemento <COLUMN>.

    Per ulteriori informazioni, vedere "Utilizzo dell'elemento <ROW> nell'importazione bulk", più avanti in questo argomento.

  • <COLUMN>
    Definisce una colonna come elemento (<COLUMN>). Ogni elemento <COLUMN> corrisponde a un elemento <FIELD>, il cui ID viene specificato nell'attributo SOURCE dell'elemento <COLUMN>.

    Per una descrizione degli attributi di questo elemento, vedere "Attributi dell'elemento <COLUMN>", più avanti in questo argomento. Vedere inoltre "Utilizzo dell'elemento <COLUMN> nell'importazione bulk", più avanti in questo argomento.

  • </BCPFORMAT>
    Necessario per terminare il file di formato.

Attributi dell'elemento <FIELD>

In questa sezione sono illustrati gli attributi dell'elemento <FIELD>, riepilogati nella sintassi dello schema seguente:

<FIELD

   ID ="fieldID"

   xsi**:**type ="fieldType"

   [ LENGTH ="n" ]

   [ PREFIX_LENGTH ="p" ]

   [ MAX_LENGTH ="m" ]

   [ COLLATION ="collationName" ]

   [ TERMINATOR ="terminator" ]

/>

Ogni elemento <FIELD> è indipendente dagli altri. Per la descrizione di un campo vengono utilizzati gli attributi seguenti:

Attributo FIELD

Descrizione

Facoltativo /

Obbligatorio

ID ="fieldID"

Specifica il nome logico del campo nel file di dati. L'ID di un campo rappresenta la chiave utilizzata per fare riferimento al campo.

<FIELD ID="fieldID"/> esegue il mapping a <COLUMN SOURCE="fieldID"/>

Obbligatorio

xsi:type ="fieldType"

Costrutto XML, utilizzato in modo simile a un attributo, che identifica il tipo dell'istanza dell'elemento. Il valore di fieldType determina gli attributi opzionali, riportati di seguito, necessari in un'istanza specifica.

Obbligatorio, a seconda del tipo di dati

LENGTH ="n"

Definisce la lunghezza per un'istanza di un tipo di dati a lunghezza fissa.

Il valore di n deve essere un numero intero positivo.

Facoltativo, a meno che non venga richiesto dal valore xsi:type

PREFIX_LENGTH ="p"

Definisce la lunghezza del prefisso per una rappresentazione di dati binary. Il valore PREFIX_LENGTH p deve essere uno dei seguenti: 1, 2, 4 o 8.

Facoltativo, a meno che non venga richiesto dal valore xsi:type

MAX_LENGTH ="m"

Corrisponde al numero massimo di byte archiviabile in un campo specifico. In assenza di una tabella di destinazione, la lunghezza massima della colonna non è nota. L'attributo MAX_LENGTH limita la lunghezza massima di una colonna di testo di output e di conseguenza anche lo spazio di archiviazione allocato al valore della colonna. Tale limitazione risulta particolarmente comoda quando si utilizza l'opzione BULK della funzione OPENROWSET in una clausola SELECT FROM.

Il valore di m deve essere un numero intero positivo. Per impostazione predefinita, la lunghezza massima è pari a 8000 caratteri per una colonna char e a 4000 caratteri per una colonna nchar.

Facoltativo

COLLATION ="collationName"

Questo attributo è consentito solo per i campi di tipo carattere. Per un elenco dei nomi di regole di confronto SQL, vedere Nome delle regole di confronto di SQL Server (Transact-SQL).

Facoltativo

TERMINATOR = "terminator"

Specifica il carattere di terminazione di un campo di dati. Il carattere di terminazione può essere costituito da un carattere qualsiasi, univoco e non facente parte dei dati.

Per impostazione predefinita, il carattere di terminazione corrisponde al carattere di tabulazione, rappresentato come \t. Per rappresentare un segno di paragrafo, utilizzare \r\n.

Viene utilizzato solo con un valore xsi:type di dati di tipo carattere, per il quale è necessario specificare questo attributo.

Valori Xsi:type dell'elemento <FIELD>

Il valore xsi:type è un costrutto XML, utilizzato in modo simile a un attributo, che identifica il tipo di dati di un'istanza di un elemento. Per informazioni sull'utilizzo di questo valore, vedere "Inserimento del valore xsi:type in un set di dati", più avanti in questa sezione.

Con valore xsi:type dell'elemento <FIELD> sono supportati i tipi di dati seguenti.

Valori xsi:type di <FIELD>

Attributi XML obbligatori

per il tipo di dati

Attributi XML facoltativi

per il tipo di dati

NativeFixed

LENGTH

Nessuno.

NativePrefix

PREFIX_LENGTH

MAX_LENGTH

CharFixed

LENGTH

COLLATION

NCharFixed

LENGTH

COLLATION

CharPrefix

PREFIX_LENGTH

MAX_LENGTH, COLLATION

NCharPrefix

PREFIX_LENGTH

MAX_LENGTH, COLLATION

CharTerm

TERMINATOR

MAX_LENGTH, COLLATION

NCharTerm

TERMINATOR

MAX_LENGTH, COLLATION

Per ulteriori informazioni sui tipi di dati di MicrosoftSQL Server, vedere Tipi di dati (Transact-SQL).

Attributi dell'elemento <COLUMN>

In questa sezione sono illustrati gli attributi dell'elemento <COLUMN>, riepilogati nella sintassi dello schema seguente:

<COLUMN

   SOURCE = "fieldID"

   NAME = "columnName"

   xsi:type = "columnType"

   [ LENGTH = "n" ]

   [ PRECISION = "n" ]

   [ SCALE = "value" ]

   [ NULLABLE = { "YES"

"NO" } ]

/>

Per l'associazione di un campo a una colonna nella tabella di destinazione vengono utilizzati gli attributi seguenti:

Attributo COLUMN

Descrizione

Facoltativo /

Obbligatorio

SOURCE ="fieldID"

Specifica l'ID del campo da associare alla colonna.

<COLUMN SOURCE="fieldID"/> esegue il mapping a <FIELD ID="fieldID"/>

Obbligatorio

NAME = "columnName"

Specifica il nome della colonna del set di righe rappresentato dal file di formato. Viene utilizzato per identificare la colonna nel set dei risultati e non corrisponde necessariamente al nome di colonna utilizzato nella tabella di destinazione.

Obbligatorio

xsi:type ="ColumnType"

Costrutto XML, utilizzato in modo simile a un attributo, che identifica il tipo di dati dell'istanza dell'elemento. Il valore di ColumnType determina gli attributi opzionali, riportati di seguito, necessari in un'istanza specifica.

NotaNota
Nella tabella seguente sono elencati i possibili valori di ColumnType nonché i relativi attributi associati.

Facoltativo

LENGTH ="n"

Definisce la lunghezza per un'istanza di un tipo di dati a lunghezza fissa. Viene utilizzato solo quanto il valore xsi:type corrisponde a un tipo di dati string.

Il valore di n deve essere un numero intero positivo.

Facoltativo (disponibile solo se il valore xsi:type corrisponde a un tipo di dati string)

PRECISION ="n"

Indica il numero di cifre in un numero. Il numero 123,45, ad esempio, ha una precisione di 5.

Il valore deve essere un numero intero positivo.

Facoltativo (disponibile solo se il valore xsi:type corrisponde a un tipo di dati numerico variabile)

SCALE ="int"

Indica il numero di cifre a destra della virgola decimale in un numero. Il numero 123,45, ad esempio, ha una scala di 2.

Il valore deve essere un numero intero.

Facoltativo (disponibile solo se il valore xsi:type corrisponde a un tipo di dati numerico variabile)

NULLABLE = { "YES"

"NO" }

Indica se una colonna supporta o meno valori NULL. Questo attributo è completamente indipendente da FIELDS. Se, tuttavia, una colonna non ammette valori NULL e il valore del campo è NULL, ovvero non è stato specificato alcun valore, verrà restituito un errore di run-time.

L'attributo NULLABLE viene utilizzato solo se si esegue un'istruzione SELECT FROM OPENROWSET (BULK...) semplice.

Facoltativo (disponibile per qualsiasi tipo di dati)

Valori Xsi:type dell'elemento <COLUMN>

Il valore xsi:type è un costrutto XML, utilizzato in modo simile a un attributo, che identifica il tipo di dati di un'istanza di un elemento. Per informazioni sull'utilizzo di questo valore, vedere "Inserimento del valore xsi:type in un set di dati", più avanti in questa sezione.

L'elemento <COLUMN> supporta i tipi di dati SQL nativi, come descritto di seguito:

Categoria del tipo

Tipi di dati di <COLUMN>

Attributi XML obbligatori

per il tipo di dati

Attributi XML facoltativi

per il tipo di dati

Fisso

SQLBIT, SQLTINYINT, SQLSMALLINT, SQLINT, SQLBIGINT, SQLFLT4, SQLFLT8, SQLDATETIME, SQLDATETIM4, SQLDATETIM8, SQLMONEY, SQLMONEY4, SQLVARIANT e SQLUNIQUEID

Nessuno.

NULLABLE

Numero variabile

SQLDECIMAL e SQLNUMERIC

Nessuno.

NULLABLE, PRECISION, SCALE

LOB

SQLIMAGE, CharLOB, SQLTEXT e SQLUDT

Nessuno.

NULLABLE

Character LOB

SQLNTEXT

Nessuno.

NULLABLE

Stringa binaria

SQLBINARY e SQLVARYBIN

Nessuno.

NULLABLE, LENGTH

Stringa di caratteri

SQLCHAR, SQLVARYCHAR, SQLNCHAR e SQLNVARCHAR

Nessuno.

NULLABLE, LENGTH

Nota importanteImportante

Per eseguire l'esportazione o l'importazione bulk dei dati SQLXML, utilizzare uno dei tipi di dati seguenti nel file di formato: SQLCHAR o SQLVARYCHAR (i dati vengono inviati nella tabella codici del client o nella tabella codici implicita nelle regole di confronto), SQLNCHAR o SQLNVARCHAR (i dati vengono inviati come Unicode) oppure SQLBINARY o SQLVARYBIN (i dati vengono inviati senza conversione).

Per ulteriori informazioni sui tipi di dati di SQL Server, vedere Tipi di dati (Transact-SQL).

Utilizzo dell'elemento &lt;ROW&gt; nell'importazione bulk

L'elemento <ROW> viene ignorato in alcuni contesti. L'elemento <ROW> può influire su un'operazione di importazione bulk a seconda della modalità con cui viene eseguita tale operazione:

  • Comando bcp

    Quando i dati vengono caricati in una tabella di destinazione, bcp ignora il componente <ROW> e carica i dati sulla base dei tipi di colonna della tabella di destinazione.

  • Istruzioni Transact-SQL (provider di set di righe con lettura bulk BULK INSERT e OPENROWSET)

    Durante l'importazione bulk di dati in una tabella, nelle istruzioni Transact-SQL viene utilizzato il componente <ROW> per generare il set di righe di input. Le istruzioni Transact-SQL eseguono inoltre conversioni appropriate dei tipi sulla base dei tipi di colonna specificati in <ROW> e della colonna corrispondente nella tabella di destinazione. Se i tipi di colonna specificati nel file di formato e quelli della tabella di destinazione non corrispondono, verrà eseguita un'ulteriore conversione dei tipi. Tale ulteriore conversione può comportare alcune discrepanze, ovvero mancanze di precisione, nel comportamento del provider di set di righe con lettura bulk di BULK INSERT o OPENROWSET rispetto a quanto ottenuto con il comando bcp.

    Le informazioni presenti nell'elemento <ROW> consentono di costruire una riga senza richiedere ulteriori informazioni. È quindi possibile generare un set di righe tramite un'istruzione SELECT (SELECT * FROM OPENROWSET(BULK datafile FORMATFILE=xmlformatfile).

    [!NOTA]

    La clausola OPENROWSET BULK comporta la specifica di un file di formato. Si noti che la conversione da un tipo di dati del campo al tipo di dati di una colonna è disponibile solo tramite un file di formato XML.

Utilizzo dell'elemento &lt;COLUMN&gt; nell'importazione bulk

Per consentire l'importazione bulk di dati in una tabella, gli elementi <COLUMN> di un file di formato associano un campo del file di dati alle colonne della tabella specificando:

  • La posizione di ogni campo all'interno di una riga del file di dati.

  • Il tipo di colonna utilizzata per la conversione del tipo di dati del campo nel tipo di dati della colonna desiderato.

In caso di mancata associazione delle colonne a un campo, quest'ultimo non verrà copiato nella riga o nelle righe generate. Questo comportamento consente a un file di dati di generare righe con diverse colonne e in diverse tabelle.

Analogamente, per consentire l'esportazione bulk di dati da una tabella, ogni <COLUMN> del file di formato associa la colonna della riga della tabella di input al campo corrispondente del file di dati di output.

Inserimento del valore xsi:type in un set di dati

Quando per la convalida di un documento XML si utilizza il linguaggio XML Schema Definition (XSD), il valore xsi:type non viene inserito nel set di dati. Per inserire le informazioni relativi al valore xsi:type nel set di dati, è tuttavia possibile caricare il file di formato XML in un documento XML, ad esempio myDoc, come illustrato nel frammento di codice seguente:

...;
myDoc.LoadXml(xmlFormat);
XmlNodeList ColumnList = myDoc.GetElementsByTagName("COLUMN");
for(int i=0;i<ColumnList.Count;i++)
{
   Console.Write("COLUMN: xsi:type=" +ColumnList[i].Attributes["type",
      "http://www.w3.org/2001/XMLSchema-instance"].Value+"\n");
}