2011-12-13 13 views
26

¿Existe un guión que pueda usar para buscar todas las columnas en todas las tablas de un catálogo SQL que no tenga la intercalación <database default>?Buscar intercalación no predeterminada en columnas para todas las tablas en SQL Server

He asumido el control de un sistema heredado y tengo diferentes colaciones en algunas tablas y me gustaría encontrar todas las instancias en un solo hit en lugar de hacerlo manualmente.

Sin embargo, no quiero cambiar la intercalación programáticamente ya que me gustaría revisar cada tabla una por una.

enter image description here

Respuesta

64

probar este guión aquí:

DECLARE @DatabaseCollation VARCHAR(100) 

SELECT 
    @DatabaseCollation = collation_name 
FROM 
    sys.databases 
WHERE 
    database_id = DB_ID() 

SELECT 
    @DatabaseCollation 'Default database collation' 

SELECT 
    t.Name 'Table Name', 
    c.name 'Col Name', 
    ty.name 'Type Name', 
    c.max_length, 
    c.collation_name, 
    c.is_nullable 
FROM 
    sys.columns c 
INNER JOIN 
    sys.tables t ON c.object_id = t.object_id 
INNER JOIN 
    sys.types ty ON c.system_type_id = ty.system_type_id  
WHERE 
    t.is_ms_shipped = 0 
    AND 
    c.collation_name <> @DatabaseCollation 

Se comprueba la intercalación predeterminada de base de datos y luego encuentra ninguna columna que no cumplan con eso.

+1

Spot on, muchas gracias. ¡Aceptará esto como la respuesta tan pronto como hayan pasado los "5 minutos"! – Rippo

+0

Gracias, me salvó mucho tiempo :) – Pking

+0

Gran respuesta, creo que hay un error menor sin embargo. La unión en system_type_id puede crear resultados duplicados si la base de datos tiene tipos personalizados. Creo que la unión debería estar en user_type_id. – PeteT

Cuestiones relacionadas