Compartir a través de


Establecer o cambiar la intercalación de columnas

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

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

    CREATE TABLE dbo.MyTable  
      (PrimaryKey   int PRIMARY KEY,  
       CharCol      varchar(10) COLLATE French_CI_AS NOT NULL  
      );  
    GO  
    ALTER TABLE dbo.MyTable ALTER COLUMN CharCol  
                varchar(10)COLLATE Latin1_General_CI_AS NOT NULL;  
    GO  
    
  • SQL Server Management Studio. Para obtener más información, Compatibilidad con Intercalación y Unicode.

  • Uso de la Column.Collation propiedad en Objetos de administración de SQL Server (SMO).

No puede cambiar la intercalación de una columna a la que hace referencia actualmente cualquiera de los siguientes elementos:

  • Una columna calculada

  • Un índice

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

  • Una restricción CHECK

  • Una restricción FOREIGN KEY

Cuando se trabaja con tempdb, la cláusula COLLATE incluye una opción database_default para especificar que una columna de una tabla temporal usa la intercalación por defecto de la base de datos de 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 text columna cuya intercalación es diferente de la página de códigos de la intercalación predeterminada de la base de datos. SQL Server convierte automáticamente los valores a la colación definida de la columna.

Intercalaciones y tempdb

La base de datos tempdb se compila cada vez que se inicia SQL Server y tiene la misma intercalación predeterminada que la base de datos del modelo . Normalmente, esto es lo mismo que la intercalación predeterminada de la instancia. Si crea una base de datos de usuario y especifica una intercalación predeterminada diferente al modelo, la base de datos de usuario tiene una intercalación predeterminada diferente a tempdb. Todos los procedimientos almacenados temporales o las tablas temporales se crean y almacenan en tempdb. Esto significa que todas las columnas implícitas de tablas temporales y todas las constantes, variables y parámetros predeterminados coercibles en procedimientos almacenados temporales tienen intercalaciones diferentes a las de los objetos comparables creados en tablas permanentes y procedimientos almacenados.

Esto podría provocar problemas con un desajuste en los ordenamientos entre las bases de datos definidas por el usuario y los objetos de base de datos del sistema. Por ejemplo, una instancia de SQL Server usa la intercalación Latin1_General_CS_AS y ejecuta 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 usa la intercalación Latin1_General_CS_AS con página de códigos 1252, y TestDB y TestPermTab.Col1 usan la intercalación Estonian_CS_AS con página de códigos 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 usa la intercalación Latin1_General_CS_AS, y TestDB y TestTab.Col1 usan la intercalación Estonian_CS_AS. Por ejemplo:

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

Dado que tempdb usa la intercalación de servidor predeterminada y TestPermTab.Col1 usa otra intercalación, 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 igual a la operación".

Para evitar el error, puede usar una de las siguientes alternativas:

  • Especifique que la columna de tabla temporal use la intercalación predeterminada de la base de datos de usuario, no tempdb. Esto permite que la tabla temporal funcione con tablas con formato similar en varias bases de datos, si es necesario para el sistema.

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

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

Véase también

Establecer o cambiar la intercalación del servidor
Establecer o cambiar la intercalación de base de datos
Compatibilidad con la intercalación y Unicode