Compartir a través de


Establecer y cambiar la intercalación de columna

Puede invalidar la intercalación de base de datos para los datos char, varchar, text, nchar, nvarchar y ntext especificando una intercalación diferente para una columna específica de una tabla y utilizando una de las siguientes cláusulas:

  • La cláusula COLLATE de CREATE TABLE y ALTER TABLE. Por ejemplo:

    CREATE TABLE MyTable
      (PrimaryKey   int PRIMARY KEY,
       CharCol      varchar(10) COLLATE French_CI_AS NOT NULL
      )
    GO
    ALTER TABLE MyTable ALTER COLUMN CharCol
                varchar(10)COLLATE Latin1_General_CI_AS NOT NULL
    GO
    
  • Para obtener más información, vea Propiedades de columnas de tablas (SQL Server Management Studio).

  • Usar la propiedad Column.Collation de objetos de administración de SQL Server (SMO).

No puede cambiar una intercalación de una columna a la que se hace referencia mediante uno de los siguientes elementos:

  • Una columna calculada

  • Un índice

  • Estadísticas de distribución, ya sean generadas automáticamente o mediante la instrucción CREATE STATISTICS

  • Una restricción CHECK

  • Una restricción FOREIGN KEY

Al trabajar con la base de datos tempdb, la cláusula COLLATE incluye una opción database_default para especificar que una columna de una tabla temporal utilice el valor predeterminado de intercalación de la base de datos del usuario actual para la conexión en lugar de la intercalación de tempdb.

Intercalaciones y columnas de texto

Puede insertar o actualizar valores en una columna text cuya intercalación sea diferente de la página de códigos de la intercalación predeterminada de la base de datos. SQL Server convierte implícitamente los valores a la intercalación de la columna.

Intercalación y tempdb

La base de datos tempdb se crea cada vez que se inicia SQL Server y tiene la misma intercalación predeterminada que la base de datos model. Suele ser la misma que la intercalación predeterminada de la instancia. Si crea una base de datos de usuario y especifica una intercalación predeterminada distinta de model, la base de datos de usuario tiene una intercalación predeterminada distinta de tempdb. Todos los procedimientos almacenados temporales o tablas temporales se crean y se almacenan en tempdb. Esto significa que todas las columnas implícitas de las tablas temporales y todas las constantes, variables y parámetros coaccionable-predeterminados en los procedimientos almacenados temporales tienen intercalaciones distintas de los objetos comparables creados en las tablas y procedimientos almacenados permanentes.

Esto puede causar problemas con una discrepancia en intercalaciones entre bases de datos definidas por el usuario y objetos de base de datos del sistema. Por ejemplo, una instancia de SQL Server utiliza la intercalación Latin1_General_CS_AS y se ejecutan las siguientes instrucciones:

CREATE DATABASE TestDB COLLATE Estonian_CS_AS;
USE TestDB;
CREATE TABLE TestPermTab (PrimaryKey int PRIMARY KEY, Col1 nchar );

En este sistema, la base de datos tempdb utiliza la intercalación Latin1_General_CS_AS con la página de código 1252; y TestDB y TestPermTab.Col1 utilizan la intercalación Estonian_CS_AS con la página de código 1257. Por ejemplo:

USE TestDB;
GO
-- Create a temporary table with the same column declarations
-- as TestPermTab
CREATE TABLE #TestTempTab (PrimaryKey int PRIMARY KEY, Col1 nchar )
INSERT INTO #TestTempTab
         SELECT * FROM TestPermTab
GO

Con el ejemplo anterior, la base de datos tempdb utiliza la intercalación Latin1_General_CS_AS collation; y TestDB y TestTab.Col1 utilizan la intercalación Estonian_CS_AS. Por ejemplo:

SELECT * FROM TestPermTab a INNER JOIN #TestTempTab on a.Col1 = #TestTempTab.Col1

Dado que tempdb utiliza la intercalación de servidor predeterminada y TestPermTab.Col1 utiliza una intercalación diferente, SQL Server devuelve este error: "No se puede resolver el conflicto de intercalación entre 'Latin1_General_CI_AS_KS_WS' y 'Estonian_CS_AS' en la operación Igual a".

Para evitar el error, puede utilizar cualquiera de las alternativas siguientes:

  • Especifique que la columna de la tabla temporal utilice la intercalación predeterminada de la base de datos de usuario, no tempdb. Esto permite que la tabla temporal trabaje con tablas de un formato parecido en varias bases de datos, si es un requisito de su sistema.

    CREATE TABLE #TestTempTab
       (PrimaryKey int PRIMARY KEY,
        Col1 nchar COLLATE database_default
       )
    
  • Especifique la intercalación correcta de la columna #TestTempTab:

    CREATE TABLE #TestTempTab
       (PrimaryKey int PRIMARY KEY,
        Col1 nchar COLLATE Estonian_CS_AS
       )