Como cambiar el Collation (Intercalación) SQL SERVER

Como cambiar el Collation (Intercalación) en una Base de Datos de SQL SERVER

Algunas veces requerimos cambiar el Collation en una Base de Datos con el que se dio de alta
una base de datos, por lo regular esto es necesario cuando nuestro servidor de base de
datos tiene establecido un collation y nuestra base de datos fue dada de alta con otro
collation distinto.

Por Ejemplo: Mi servidor tiene el collation SQL_Latin1_General_CP1_CI_AI
y una base de datos se dio de alta con el collation: Modern_Spaish_CI_AS

El primer collation significa que el servidor el Collation está configurado:
CI (Case Insensitive ó Insensible a Mayúsculas y Minúsculas) AI (Accent Insensitive ó Insensible a Asentos)

y la base de datos fue configurada como:
CI (Case Insensitive) AS (Accent Sensitive ó Sensible a Acentos)

Esto provoca que al realizar alguna búsqueda, por ejemplo de algún nombre que contenga
un asento en una letra el SQL nos va mandar un error de Collation similar al siguiente:




Para cambiar el Collation de una base de datos sigamos las siguientes instrucciones

-- Nos cambiamos a la Base de Datos Master con credenciales del usuario SA
USE master;

-- Con este query checamos el collation (intercalación) que tiene actualmente nuestra BD
SELECT name, collation_name
FROM sys.databases
WHERE name = N'MI_BASE_DE_DATOS'

Como cambiar el collation de una Base de Datos en SQL SERVER

-- Antes de Aplicar el Alter a la Base de Datos tendremos que poner la BD en modo single_user, es decir que los demás usuarios serán desconectados por un momento. (Avise a los usuarios)

ALTER DATABASE MI_BASE_DE_DATOS SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

-- Aplicamos un alter database con el nombre de la base de datos y el collation (intercalación) que queremos establecer
ALTER DATABASE MI_BASE_DE_DATOS COLLATE SQL_LATIN1_GENERAL_CP1_CI_AI


-- Regresamos el modo de acceso de la base de datos a Multi Usuario
ALTER DATABASE MI_BASE_DE_DATOS SET MULTI_USER;

-- Volvemos a verificar el Collation de la BD:
SELECT name, collation_name
FROM sys.databases
WHERE name = N'MI_BASE_DE_DATOS'

Cambiar Collation SQL SERVER 2008


-- Ya debería estar cambiada.

En mi caso me presentó un error posterior debido a un objeto que marcaba como que tenía dependencias y que debido a ello no se podía hacer el alter de la base de datos.

The object 'FuncionMesesaDias' is dependent on database collation. 
The database collation cannot be changed if a schema-bound object depends on it. 
Remove the dependencies on the database collation and 
then retry the operation.

Como este objeto es una función, lo único que hice fue checar su estructura con la instrucción sp_helptext

sp_helptext FuncionMesesaDias copié la estructura en un bloc de notas.
después de esto eliminé la función con la funcion drop function

apliqué nuevamente las instrucciones para cambiar el collation de la Base de Datos y ya no marcó ningún error.

Después de cambiado el collation volví a crear la función 'FuncionMesesaDias'  con la estructura que había copiado previamente en el bloc de notas


Una vez cambiado el collation de nuestra base de datos puede ser que algunas tablas que tienen campos con el collation anterior también tengan que ser modificadas, para ello se puede usar la sentencia:

ALTER TABLE [dbo].[nombre_de_tabla]
        ALTER COLUMN [nombredecampo] VARCHAR(3) COLLATE SQL_LATIN1_GENERAL_CP1_CI_AI NULL


Quizá nos encontremos con algún error de que hay indices o llaves foraneas que dependen de este campo, si ese fuera el caso no queda otro remedio que eliminar los indices que hagan referencia al campo que queremos modificar.

DROP INDEX  nombre_de_indice ON nombre_de_tabla


En caso de que no puedas modificar la estructura de las tablas para cambiar los collation lo que puedes hacer es utilizar la siguiente instrucción:

SELECT ID
FROM Mi_taba_1
INNER JOIN Mi_Tabla_2
WHERE Mi_tabla_1.Collation1Col COLLATE DATABASE_DEFAULT
Mi_Tabla_2.Collation2Col COLLATE DATABASE_DEFAULT



¡Suerte!

Mis Mejores Saludos
Xavier García








Select Top en una consulta SQL

SELECT TOP EN SQL SERVER

Algunas veces nos interesa obtener solo algunos registros de una consulta en SQL server.

Por ejemplo, si tenemos la tabla "Empleados" con 10 registros, y a nosotros solamente nos interesa obtener los últimos 4 empleados que se han dado de alta en la empresa, entonces podemos hacer uso de la sentencia TOP y del ordenamiento Order By

Te dejo los script para que puedas crear la tabla empleados y para que insertes algunos valores de Prueba:

-- Creamos la tabla Empleados
CREATE TABLE EMPLEADOS(
ID_EMPLEADO INT NOT NULL,
NOMBRE VARCHAR(100) NOT NULL,
FECHA_INGRESO DATETIME NOT NULL)

-- Insertamos 10 registros a la tabla empleados, con una fecha de ingreso aleatoria
INSERT INTO EMPLEADOS SELECT 1 , 'JUAN', '20160115'
INSERT INTO EMPLEADOS SELECT 2 , 'PEDRO', '20160201'
INSERT INTO EMPLEADOS SELECT 3 , 'JACINTO', '20160101'
INSERT INTO EMPLEADOS SELECT 4 , 'LUCAS', '20140101'
INSERT INTO EMPLEADOS SELECT 5 , 'RENE', '20130115'
INSERT INTO EMPLEADOS SELECT 6 , 'JULIO', '20120201'
INSERT INTO EMPLEADOS SELECT 7 , 'RAMON', '20100101'
INSERT INTO EMPLEADOS SELECT 8 , 'ALEX', '20160101'
INSERT INTO EMPLEADOS SELECT 9 , 'ANDY', '20140115'
INSERT INTO EMPLEADOS SELECT 10 , 'FRANCISCO', '20130201'

Ahora, aplicamos el Select Top para que la consulta solo nos traiga los 4 primeros empleados que se dieron de alta, aplicando el ordenamiento descendente  en el campo fecha_ingreso

La consulta quedaría de la siguiente Manera:
SELECT TOP 4 ID_EMPLEADO, NOMBRE, FECHA_INGRESO
FROM EMPLEADOS
ORDER BY FECHA_INGRESO DESC

el resultado es el siguiente:
Select Top en SQL Server

Este tipo de sentencia TOP es útil cuando tenemos miles de registros y queremos traernos solo algunos. 

Mis mejores Saludos
Xavier García


Como Hacer un Left Join en SQL Server

En este artículo te explico Como hacer un Left Join en Sql Server,

Un Left Join en SQL significa que al cruzar dos tablas A (Izquierda) y B (Derecha) nos interesa que todos los resultados de la tabla A se obtengan aunque algunos resultados de B no coincidan al relacionar las dos tablas por el campo relacionado.

Pero como es dificil entenderlo con Teoría voy a explicarlo con un caso práctico.

Tenemos la tabla Empleados que contiene el ID de los Empleados y su nombre:

Como hacer un Left Join en SQL Server

Por otra parte tenemos la tabla Cantidad_Hijos en la que se almacena el ID del empleado y la cantidad de hijos que tiene cada uno de los empleados (si es que tienen hijos, )


Al realizar un Left Join de la tabla empleados con la tabla Cantidad_Hijos, relacionándolos por el campo en común id_empleado este sería el resultado:

Resultado de Left Join

Como puedes ver en el ejemplo en la tabla empleados se dieron de alta 4 personas, sin embargo el empleado con el id 4  (Lucas) no tiene hijos, entonces en la tabla cantidad_hijos no existe su id, es por eso que en el resultado del left join el campo id_empleado y el campo hijos aparecen con valor NULL

Te dejo el script para que puedas crear las tablas y realizar el ejemplo por ti mismo:

-- CREANDO LA TABLA EMPLEADOS
CREATE TABLE EMPLEADOS(
ID_EMPLEADO INT NOT NULL,
NOMBRE VARCHAR(100) NOT NULL)

-- AÑADIENDO VALORES A LA TABLAS EMPLEADOS
INSERT INTO EMPLEADOS SELECT 1 , 'JUAN'
INSERT INTO EMPLEADOS SELECT 2 , 'PEDRO'
INSERT INTO EMPLEADOS SELECT 3 , 'JACINTO'
INSERT INTO EMPLEADOS SELECT 4 , 'LUCAS'

-- CREANDO LA TABLA CANTIDAD_HIJOS
CREATE TABLE CANTIDAD_HIJOS(
ID_EMPLEADO INT NOT NULL,
HIJOS INT NOT NULL)

-- AÑADIENDO VALORES A LA TABLAS CANTIDAD_HIJOS
INSERT INTO CANTIDAD_HIJOS SELECT 1 ,2
INSERT INTO CANTIDAD_HIJOS SELECT 2 ,1
INSERT INTO CANTIDAD_HIJOS SELECT 3 ,3

-- APLICANDO EL LEFT JOIN 
SELECT E.*, CH.*
FROM EMPLEADOS AS E LEFT JOIN 
CANTIDAD_HIJOS AS CH ON
E.ID_EMPLEADO = CH.ID_EMPLEADO


Como hacer un Left Join en Sql Server