Sintaxis de esquema para archivos de formato XML

En esta sección se describe la sintaxis de los archivos de formato XML. Para ver la correspondencia de la sintaxis con los archivos de formato XML reales, vea Archivos de formato XML de ejemplo. En esta sección también se trata cómo la importación en bloque usa los elementos <ROW> y <COLUMN> y cómo colocar el valor xsi:type de un elemento en un conjunto de datos.

Puede usar un archivo de formato XML con un comando bcp, una instrucción BULK INSERT o una instrucción INSERT ... SELECT * FROM OPENROWSET(BULK...).

Nota

   Puede modificar un archivo de formato de forma que le permita importar de forma masiva desde un archivo de datos en el que el número y/o el orden de los campos difieren del número y/o el orden de las columnas de la tabla. Para obtener más información, vea Usar un archivo de formato para asignar campos a columnas durante la importación masiva.

Sintaxis básica del esquema XML

Las instrucciones de la sintaxis muestran solo los elementos (<BCPFORMAT>, <RECORD>, <FIELD>, <ROW> y <COLUMN>) y sus atributos básicos.

<BCPFORMAT ...>

   <RECORD>

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

      />

   </RECORD>

   <ROW>

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

      />

   </ROW>

</BCPFORMAT>

Nota

Los atributos adicionales asociados al valor de xsi:type en un elemento <FIELD> o <COLUMN> se describen más adelante en este tema.

Descripción de los elementos de esquema

En esta sección se resume la finalidad de cada elemento que define el esquema XML para los archivos de formato XML. Los atributos se describen más adelante, en otras secciones de este tema.

  • <BCPFORMAT>
    Es el elemento de archivo de formato que define la estructura de los registros de un determinado archivo de datos y su correspondencia con las columnas de una fila de tabla en la tabla.

  • <RECORD .../>
    Define un elemento complejo que contiene uno o más elementos <FIELD>. El orden en que se declaran los campos en el archivo de formato es el orden en que estos campos aparecen en el archivo de datos.

  • <FIELD .../>
    Define un campo del archivo de datos que contiene datos.

    Los atributos de este elemento se tratan en "Atributos del elemento <FIELD>", más adelante en este tema.

  • <ROW .../>
    Define un elemento complejo que contiene uno o más elementos <COLUMN>. El orden de los elementos <COLUMN> es independiente del orden de los elementos <FIELD> en una definición RECORD. El orden de los elementos <COLUMN> de un archivo de formato determina el orden de las columnas del conjunto de filas resultante. Los campos de datos se cargan en el orden en que los elementos <COLUMN> correspondientes se declaran en el elemento <COLUMN>.

    Para obtener más información, vea "Cómo usa la importación en bloque el elemento <ROW>", más adelante en este tema.

  • <COLUMN>
    Define una columna como elemento (<COLUMN>). Cada elemento <COLUMN> corresponde a un elemento <FIELD> (cuyo Id. se especifica en el atributo SOURCE del elemento <COLUMN>).

    Los atributos de este elemento se tratan en "Atributos del elemento <COLUMN>", más adelante en este tema. Vea también "Cómo usa la importación en bloque el elemento <COLUMN>", más adelante en este tema.

  • </BCPFORMAT>
    Obligatorio para finalizar el archivo de formato.

Atributos del elemento <FIELD>

En esta sección se describen los atributos del elemento <FIELD>, que se resumen en la sintaxis de esquema siguiente:

<FIELD

   ID ="fieldID"

   xsi**:**type ="fieldType"

   [ LENGTH ="n" ]

   [ PREFIX_LENGTH ="p" ]

   [ MAX_LENGTH ="m" ]

   [ COLLATION ="collationName" ]

   [ TERMINATOR ="terminator" ]

/>

Cada elemento <FIELD> es independiente de los demás. Un campo se describe según los atributos siguientes:

Atributo de FIELD

Descripción

Opcional /

Obligatorio

ID ="fieldID"

Especifica el nombre lógico del campo incluido en el archivo de datos. El valor de ID de un campo es la clave usada para referirse al campo.

<FIELD ID="fieldID"/> se asigna a <COLUMN SOURCE="fieldID"/>

Obligatorio

xsi:type ="fieldType"

Es una construcción XML (usada como atributo) que identifica el tipo de la instancia del elemento. El valor de fieldType determina qué atributos opcionales (a continuación) necesita el usuario en una instancia determinada.

Obligatorio (en función del tipo de datos)

LENGTH ="n"

Este atributo define la longitud de una instancia de un tipo de datos de longitud fija.

El valor de n debe ser un entero positivo.

Opcional a no ser que el valor de xsi:type lo requiera

PREFIX_LENGTH ="p"

Este atributo define la longitud del prefijo para una representación de datos binarios. El valor de PREFIX_LENGTH, p, debe ser uno de los siguientes: 1, 2, 4 o 8.

Opcional a no ser que el valor de xsi:type lo requiera

MAX_LENGTH ="m"

Este atributo es el número máximo de bytes que se pueden almacenar en un campo determinado. Sin una tabla de destino, la longitud máxima de la columna se desconoce. El atributo MAX_LENGTH restringe la longitud máxima de una columna de caracteres de salida y limita el almacenamiento asignado al valor de la columna. Esto resulta especialmente útil al usar la opción BULK de la función OPENROWSET en una cláusula SELECT FROM.

El valor de m debe ser un entero positivo. De forma predeterminada, la longitud máxima es de 8.000 caracteres para una columna char y de 4.000 caracteres para una columna nchar.

Opcional

COLLATION ="collationName"

COLLATION solo se permite para campos de caracteres. Para obtener una lista de los nombres de intercalación SQL, vea Nombre de intercalación de SQL Server (Transact-SQL).

Opcional

TERMINATOR = "terminator"

Este atributo especifica el terminador de un campo de datos. El terminador puede ser cualquier carácter. Debe ser un carácter único que no forme parte de los datos.

De forma predeterminada, el terminador del campo es el carácter de tabulación (representado como \t). Para representar una marca de párrafo, use \r\n.

Sólo se usa con xsi:type de datos de caracteres, que requiere este atributo

Valores xsi:type del elemento <FIELD>

El valor xsi:type es una construcción XML (usada como atributo) que identifica el tipo de datos de una instancia de un elemento. Para obtener más información acerca de su uso, vea "Colocar el valor xsi:type en un conjunto de datos", más adelante en este tema.

El valor xsi:type del elemento <FIELD> admite los siguientes tipos de datos.

Valores xsi:type de <FIELD>

Atributos XML obligatorios

para el tipo de datos

Atributos XML opcionales

para el tipo de datos

NativeFixed

LENGTH

Ninguno

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

Para obtener más información acerca de los tipos de datos de Microsoft SQL Server, vea Tipos de datos (Transact-SQL).

Atributos del elemento <COLUMN>

En esta sección se describen los atributos del elemento <COLUMN>, que se resumen en la siguiente sintaxis de esquema:

<COLUMN

   SOURCE = "fieldID"

   NAME = "columnName"

   xsi:type = "columnType"

   [ LENGTH = "n" ]

   [ PRECISION = "n" ]

   [ SCALE = "value" ]

   [ NULLABLE = { "YES"

"NO" } ]

/>

Un campo se asigna a una columna de la tabla de destino mediante los atributos siguientes:

Atributo de COLUMN

Descripción

Opcional /

Obligatorio

SOURCE ="fieldID"

Especifica el Id. del campo que se asigna a la columna.

<COLUMN SOURCE="fieldID"/> se asigna a <FIELD ID="fieldID"/>

Obligatorio

NAME = "columnName"

Especifica el nombre de la columna en el conjunto de filas representado por el archivo de formato. Este nombre de columna se usa para identificar la columna en el conjunto de resultados y no es necesario que corresponda al nombre de columna usado en la tabla de destino.

Obligatorio

xsi:type ="ColumnType"

Es una construcción XML (usada como atributo) que identifica el tipo de datos de la instancia del elemento. El valor de ColumnType determina qué atributos opcionales (a continuación) necesita el usuario en una instancia determinada.

NotaNota
Los valores posibles de ColumnType y sus atributos asociados aparecen en la tabla siguiente.

Opcional

LENGTH ="n"

Define la longitud de una instancia de un tipo de datos de longitud fija. LENGTH se usa solo cuando xsi:type es un tipo de datos de cadena.

El valor de n debe ser un entero positivo.

Opcional (solo disponible si xsi:type es un tipo de datos de cadena)

PRECISION ="n"

Indica el número de dígitos de un número. Por ejemplo, el número 123,45 tiene una precisión de 5.

El valor debe ser un entero positivo.

Opcional (solo disponible si xsi:type es un tipo de datos de número variable)

SCALE ="int"

Indica el número de dígitos situados a la derecha de la coma decimal de un número. Por ejemplo, el número 123,45 tiene una escala de 2.

El valor debe ser un entero.

Opcional (solo disponible si xsi:type es un tipo de datos de número variable)

NULLABLE = { "YES"

"NO" }

Indica si una columna puede aceptar valores NULL. Este atributo es completamente independiente de FIELDS. No obstante, si una columna tiene el valor de NULLABLE establecido en NO y el campo especifica NULL (es decir, no especifica ningún valor), se produce un error de tiempo de ejecución.

El atributo NULLABLE solo se usa si escribe una instrucción SELECT FROM OPENROWSET(BULK...) simple.

Opcional (disponible para cualquier tipo de datos)

Valores xsi:type del elemento <COLUMN>

El valor xsi:type es una construcción XML (usada como atributo) que identifica el tipo de datos de una instancia de un elemento. Para obtener más información acerca de su uso, vea "Colocar el valor xsi:type en un conjunto de datos", más adelante en este tema.

El elemento <COLUMN> admite tipos de datos SQL nativos, de la forma siguiente:

Categoría de tipo

Tipos de datos de <COLUMN>

Atributos XML obligatorios

para el tipo de datos

Atributos XML opcionales

para el tipo de datos

Fija

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

Ninguno

NULLABLE

Número de variable

SQLDECIMAL y SQLNUMERIC

Ninguno

NULLABLE, PRECISION, SCALE

LOB

SQLIMAGE, CharLOB, SQLTEXT y SQLUDT

Ninguno

NULLABLE

LOB de caracteres

SQLNTEXT

Ninguno

NULLABLE

Cadena binaria

SQLBINARY y SQLVARYBIN

Ninguno

NULLABLE, LENGTH

Cadena de caracteres

SQLCHAR, SQLVARYCHAR, SQLNCHAR y SQLNVARCHAR

Ninguno

NULLABLE, LENGTH

Nota importanteImportante

Para importar o exportar datos SQLXML de manera masiva, use uno de los siguientes tipos de datos en el archivo de formato: SQLCHAR o SQLVARYCHAR (los datos se envían en la página de códigos del cliente o en la página de códigos implícita en la intercalación), SQLNCHAR o SQLNVARCHAR (los datos se envían como Unicode), o SQLBINARY o SQLVARYBIN (los datos se envían sin ninguna conversión).

Para obtener más información acerca de los tipos de datos de SQL Server, vea Tipos de datos (Transact-SQL).

Cómo usa la importación en bloque el elemento &lt;ROW&gt;

Se ignora el elemento <ROW> en algunos contextos. El que un elemento <ROW> afecte a una operación de importación en bloque depende de cómo se realice la operación:

  • el comando bcp

    Al cargar datos en una tabla de destino, bcp pasa por alto el componente <ROW>. En su lugar, bcp carga los datos en función de los tipos de columnas de la tabla de destino.

  • Instrucciones Transact-SQL (proveedor de conjuntos de filas BULK de BULK INSERT y OPENROWSET)

    Al importar datos de forma masiva en una tabla, las instruccionesTransact-SQL utilizan el componente <ROW> para generar el conjunto de filas de entrada. Las instrucciones Transact-SQL también realizan las conversiones de tipos adecuadas en función de los tipos de columna especificados en <ROW> y de la columna correspondiente en la tabla de destino. Si los tipos de columna especificados en el archivo de formato y la tabla de destino no coinciden, se realiza una conversión de tipo adicional. Esta conversión de tipo adicional puede llevar a discrepancias (es decir, a una pérdida de precisión) en cuanto al comportamiento en el proveedor de conjuntos de filas BULK de OPENROWSET o BULK INSERT en comparación con bcp.

    La información del elemento <ROW> permite construir una fila sin necesidad de disponer de información adicional. Por este motivo, puede generar un conjunto de filas mediante una instrucción SELECT (SELECT * FROM OPENROWSET(BULK datafile FORMATFILE=xmlformatfile).

    Nota

    La cláusula OPENROWSET BULK requiere un archivo de formato (tenga en cuenta que solo se puede convertir desde el tipo de datos del campo al tipo de datos de una columna con un archivo de formato XML).

Cómo usa la importación en bloque el elemento &lt;COLUMN&gt;

Para importar datos de forma masiva a una tabla, los elementos <COLUMN> de un archivo de formato asignan un campo de archivo de datos a columnas de tabla al especificar:

  • La posición de cada campo dentro de una fila del archivo de datos.

  • El tipo de columna, que se usa para convertir el tipo de datos de campo al tipo de datos de columna deseado.

Si un campo no tiene asignada ninguna columna, el campo no se copia en las filas generadas. Este comportamiento permite a un archivo de datos generar filas con distintas columnas (en tablas diferentes).

De forma similar, para exportar de forma masiva datos de una tabla, cada elemento <COLUMN> del archivo de formato asigna la columna de la fila de la tabla de entrada a su campo correspondiente en el archivo de datos de salida.

Colocar el valor xsi:type en un conjunto de datos

Si un documento XML se valida con el lenguaje de definición de esquema XML (XSD), el valor xsi:type no se coloca en el conjunto de datos. No obstante, puede colocar la información de xsi:type en el conjunto de datos si carga el archivo de formato XML en un documento XML (por ejemplo, myDoc), tal como ilustra el siguiente fragmento de código:

...;
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");
}