Copiar datos entre distintas intercalaciones

En Microsoft SQL Server es posible cambiar datos entre columnas Unicode sin problemas y necesidad de realizar conversiones. Sin embargo, los datos movidos entre columnas que contienen datos de caracteres no Unicode deben convertirse de la página de códigos original a la página de códigos de destino. Una página de códigos es un juego de caracteres ordenados de un script dada en la que un índice numérico, o un valor de punto de código, está asociado a cada uno de los caracteres. Las páginas de códigos admiten juegos de caracteres y distribuciones de teclado utilizados por diferentes configuraciones regionales de Microsoft Windows. Para obtener una lista de las páginas de códigos admitidas, vea Arquitectura de página de códigos.

De manera predeterminada, los datos de caracteres se convierten de la siguiente manera:

Operación

Datos de caracteres convertidos en:

Exportar

Caracteres de página de códigos OEM

Importar

Caracteres de página de códigos ANSI/Microsoft Windows

La conversión entre las páginas de códigos OEM y ANSI ocasiona la pérdida de los caracteres del juego de caracteres extendidos o de doble byte (DBCS). Para evitar estas conversiones, en SQL Server puede especificar una página de códigos o una intercalación.

Nota

Para obtener más información acerca de la transferencia de una base de datos de una intercalación a otra, vea este sitio web de Microsoft.

En SQL Server 7.0 o posterior, el almacenamiento físico de las cadenas de caracteres se controla mediante intercalaciones. El establecimiento de intercalaciones se admite en cuatro niveles: la instancia del servidor, una base de datos, una columna de la tabla y una expresión. Una intercalación especifica tres propiedades:

  • La página de códigos que se utilizan para almacenar datos de carácter no Unicode.

  • El criterio de ordenación para utilizar los tipos de datos Unicode (nchar, nvarchar y ntext). Un criterio de ordenación define la secuencia en la que se ordenan los caracteres y la forma en que se evalúan en las operaciones de comparación.

  • El criterio de ordenación para utilizar los tipos de datos de carácter no Unicode (char, varchar y text).

Nota

Microsoft recomienda especificar un nombre de intercalación para cada columna de un archivo de formato.

Para obtener acceso a una introducción a las páginas de códigos y las intercalaciones, vea Compatibilidad con la intercalación y Unicode. Para obtener información exhaustiva, vea Trabajar con intercalaciones.

Usar una intercalación de columna

En SQL Server 7.0 y posterior, puede controlar la conversión de los datos especificando la intercalación en la que se almacenan los datos en el campo del archivo de datos de destino, en el caso de una exportación masiva, o la columna de la tabla de destino, en el caso de una operación de importación masiva. Las traducciones necesarias entre la intercalación de los archivos de datos y las intercalaciones de las columnas de las tablas de la base de datos son realizadas a nivel interno por la operación de importación o exportación.

Nota

En el caso de SQL Server 7.0 y posterior, se puede especificar una página de códigos, pero es preferible especificar la intercalación en un archivo de formato.

Las intercalaciones siempre se aplican a las columnas SQLCHAR en operaciones tanto de importación masiva como de exportación masiva. Las especificaciones de intercalación de columna siempre se omiten para las columnas que no tengan SQLCHAR o SQLNCHAR especificados como tipo de datos de host. Las intercalaciones se utilizan para determinar el criterio de ordenación de las columnas SQLCHAR y SQLNCHAR durante las operaciones de importación masiva para las que se hace referencia a las columnas en la sugerencia ORDER.

Para especificar la intercalación, debe utilizar un archivo de formato. Ambos tipos de archivos de formato admiten la especificación de intercalaciones de columna. Para obtener información sobre el uso de intercalaciones en archivos de formato no XML, vea la siguiente sección, Especificar intercalaciones de columna en archivos de formato no XML. Para obtener información sobre el uso de intercalaciones en archivos de formato no XML, vea Descripción de los archivos de formato XML.

Especificar intercalaciones de columna en archivos de formato no XML

La columna final de un archivo de formato no XML (la columna situada en la posición ordinal 8) contiene una especificación de intercalación que define cómo se almacenan los datos de esa columna en el archivo de datos. Las opciones de columna de intercalación son las siguientes:

Opción

Descripción

name

Especifica el nombre de la intercalación que se utiliza para guardar los datos en el archivo de datos. Para obtener una lista de los nombres de intercalación SQL, vea Nombre de intercalación de SQL Server (Transact-SQL).

RAW

Especifica que los datos están almacenados en la página de códigos especificada en una opción de página de códigos del comando o de la sugerencia BCPFILECP de bcp_control. Si no se especifica ninguna de ellas, la intercalación del archivo de datos es la de la página de códigos OEM del equipo cliente.

NotaNota
Para obtener más información sobre las opciones de páginas de códigos, vea "Usar una página de códigos" más adelante en este tema. Para obtener más información sobre la sugerencia BCPFILECP, vea bcp_control.

""

Tiene el mismo significado que RAW.

Ejemplos

En el ejemplo siguiente se muestra un archivo de formato no XML con intercalaciones de columna especificadas para los campos 2 y 3. La información de intercalación se muestra en negrita.

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

El archivo de formato anterior corresponde a la tabla HumanResources.Department de la base de datos de ejemplo AdventureWorks2008R2, que tiene cuatro columnas: DepartmentID, Name, GroupName y ModifiedDate.

Para obtener más información sobre los archivos de formato no XML, vea Descripción de los archivos de formato no XML.

Usar una página de códigos

Nota

Para controlar la conversión de datos, Microsoft recomienda utilizar un archivo de formato para especificar intercalaciones de columna para una operación de exportación o importación masiva. Para obtener más información, vea "Usar una intercalación de columna" en la sección anterior.

La sintaxis necesaria para especificar una página de códigos es la siguiente:

  • Para especificar una página de códigos en un comando bcp, utilice el modificador -C:

    -C { ACP | OEM | RAW | code_page }

  • Para especificar una página de códigos en una instrucción BULK INSERT o INSERT ... SELECT * FROM OPENROWSET(BULK...) utilice la opción CODEPAGE:

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

Tanto el modificador -C como la opción CODEPAGE aceptan los siguientes valores para la página de códigos.

Valor de página de códigos

Descripción

ACP

Durante una operación de importación, especifica que los campos de datos del tipo de datos char, varchar o text se conviertan de la página de códigos ANSI/Windows (ISO 1252) en la página de códigos de SQL Server.

Durante una operación de exportación, especifica que bcp convierta estas columnas de la página de códigos de SQL Server en la página de códigos ANSI/Windows.

OEM (valor predeterminado)

Durante una operación de importación, especifica que los campos de datos del tipo de datos char, varchar o text se conviertan de la página de códigos OEM del sistema en la página de códigos de SQL Server.

Durante una operación de exportación, especifica que bcp convierta estas columnas de la página de códigos de SQL Server en la página de códigos OEM del sistema.

RAW

No se realiza ninguna conversión entre páginas de códigos. Ésta es la opción más rápida.

code_page

Número específico de una página de códigos (por ejemplo, 850). Para obtener una lista de las páginas de códigos admitidas, vea Arquitectura de página de códigos.

Ejemplos

Los siguientes ejemplos utilizan la tabla HumanResources.myTeam en la base de datos AdventureWorks2008R2. Antes de poder ejecutar los ejemplos, debe crear esta tabla. Para obtener información sobre la tabla y cómo crearla, vea Crear la tabla HumanResources.myTeam.

Nota

Antes de probar el siguiente ejemplo, debe eliminar las filas existentes de la tabla myTeam para evitar conflictos de clave principal.

A. Usar una página de códigos con bcp

Este ejemplo utiliza bcp para exportar de manera masiva los datos de la tabla HumanResources.myTeam de la base de datos AdventureWorks2008R2 al archivo de datos myTeam850.txt; utilice la página de códigos 850. En el símbolo del sistema de Windows, escriba:

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

B. Usar una página de códigos con BULK INSERT

En este ejemplo se utiliza BULK INSERT para importar de manera masiva myTeam850.txt, creado en el ejemplo bcp precedente, en la tabla AdventureWorks2008R2HumanResources.myTeam.

En una herramienta de consulta, como el Editor de consultas de SQL Server Management Studio, ejecute:

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

Exportación masiva de datos entre diferentes intercalaciones

En una operación de exportación masiva, la especificación de intercalación controla la página de códigos utilizada para almacenar los datos de caracteres en el archivo de datos. Se aplica a:

  • Todas las columnas de un archivo de datos de formato de caracteres.

  • Todas las columnas de un archivo en modo nativo en el que se especifique SQLCHAR como el tipo de datos del archivo de host.

  • Caracteres SQLCHAR cuyos valores son mayores que 127 o menores que 32.

    Las intercalaciones se aplican a los caracteres cuyos valores están comprendidos entre 32 y 127, pero todas las páginas de códigos asignan los mismos caracteres a los valores comprendidos entre 32 y 127, por lo que aplicar diferentes intercalaciones no tiene ningún efecto.

Las reglas para determinar qué intercalación o página de códigos se utiliza en una operación de exportación masiva son las siguientes:

  • Si se especifica la intercalación de columna en un archivo de formato o utilizando la función bcp_setcolfmt de ODBC (bcp_setcolfmt), los datos de caracteres se almacenan utilizando la página de códigos ANSI asociada a la intercalación.

  • Si no se especifica ninguna intercalación de columna, pero una opción de página de códigos del comando o la sugerencia BCPFILECP de bcp_control especificó una página de códigos, todos los datos SQLCHAR de las columnas que no tengan especificación de intercalación se almacenan utilizando la página de códigos especificada.

    Nota

    Para obtener información sobre las opciones de páginas de códigos, vea "Usar una página de códigos" anteriormente en este tema. Para obtener más información sobre la sugerencia BCPFILECP, vea bcp_control.

  • Si no especifica una intercalación o una página de códigos, los datos SQLCHAR se almacenan utilizando la página de códigos OEM del equipo cliente.

Nota

Los archivos de datos no almacenan ninguna información sobre la intercalación/página de códigos.

Importación masiva de datos entre diferentes intercalaciones

En una operación de importación masiva, la interpretación de la página de códigos se aplica a las columnas almacenadas como SQLCHAR de formato de caracteres en el archivo de datos. En un archivo de datos de formato de caracteres, todas las columnas se almacenan como SQLCHAR. Puesto que los archivos de datos no almacenan información sobre la intercalación/página de códigos, en el caso de una operación de importación masiva debe suministrar información sobre la intercalación/página de códigos de los campos de datos.

Las reglas para determinar qué intercalación o página de códigos se utiliza en una operación de importación masiva son las siguientes:

  • Si especifica la intercalación de columna en un archivo de formato o utilizando la función bcp_setcolfmt de ODBC (bcp_setcolfmt), los datos SQLCHAR de un archivo de datos se interpretan utilizando la página de códigos ANSI asociada a la intercalación de columna especificada. Asegúrese de que las especificaciones de intercalación coinciden con las intercalaciones del archivo de datos.

  • Si no se especifica una intercalación de columna, pero sí se especifica una página de códigos mediante la opción de página de códigos del comando o la sugerencia BCPFILECP de bcp_control, los datos SQLCHAR se interpretan utilizando la página de códigos especificada.

    Nota

    Para obtener información sobre las opciones de páginas de códigos, vea Usar una página de códigos anteriormente en este tema. Para obtener más información sobre la sugerencia BCPFILECP, vea bcp_control.

  • Si no especifica ninguna intercalación o página de códigos, los datos de las columnas SQLCHAR se interpretan utilizando la página de códigos OEM del equipo cliente.

En una operación de importación masiva, la especificación de intercalación controla lo siguiente:

  • La forma en que la operación intenta interpretar la página de códigos de las columnas SQLCHAR en el archivo de datos.

  • Cómo bcp o BULK INSERT aplica la sugerencia ORDER, si se especifica.

    Si utiliza la sugerencia ORDER, la operación de importación masiva utiliza intercalaciones para interpretar correctamente la sugerencia ORDER. Esta sugerencia se aplica tanto a las columnas SQLCHAR como SQLNCHAR. Los datos de las columnas a las que hace referencia una sugerencia ORDER deben tener la secuencia definida por la intercalación asignada a esas columnas. Para obtener más información, vea Controlar el criterio de ordenación en las importaciones masivas de datos.