Collation Checker Version 2
this is version 2 of a quick sproc I put together to do various collation checks.
now excludes offline databases (using state <> 6 from sys.databases)
checks are :-
databases that have different collations from server
databases that have different collations of columns within
databases that have column collations different from database collation
run by :-
exec sp_collation_checker
USE [master]
GO
/****** Object: StoredProcedure [dbo].[sp_collation_checker] Script Date: 07/13/2007 15:58:51 ******/SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
drop procedure sp_collation_checker
go
create procedure [dbo].[sp_collation_checker]
as
-- this procedure checks the collation as follows :-
-- databases that have different collations from server
-- databases that have different collations of columns within
-- databases that have column collations different from database collation
--
-- it returns some text with a description of the issue e.g :-
-- "there are no databases that have a different collation from master"
-- "the pgr_test database has more than one collation"
-- "the col2 column collation (Latin1_General_CS_AS) in the pgr_test database does not match
-- the database collation (Latin1_General_CI_AS)"
--
-- this procedure has been tested on sql server 2000 sp4 and SQL Server 2005 sp2
-- any problems email pgr_consulting @ yahoo.com
set nocount on
declare @msg varchar(2000), @master_collation varchar(255)
SELECT @master_collation=convert(sysname,DatabasePropertyEx('master','Collation'))
SELECT 'the ' + name + ' database has a different collation from master, ' +
convert(sysname,DatabasePropertyEx(name,'Collation')) + ' (master=' + @master_collation+')'
as 'server/database collation check'
into #temp_collations
from sysdatabases
where convert(sysname,DatabasePropertyEx('master','Collation')) <>
convert(sysname,DatabasePropertyEx(name,'Collation'))
order by name
if @@rowcount = 0
begin
select 'there are no databases that have a different collation from master'
as 'server/database collation check'
end
else
begin
select * from #temp_collations
end
set nocount on
create table #databases (dbid int identity(1,1), dbname varchar(100), collation varchar(100))
create table #database_collations (dbname varchar(100), collation varchar(100))
create table #database_collations_by_column (dbname varchar(100), colname varchar(100), collation varchar(100))
declare @number_of_dbs int, @counter int, @sql varchar(8000), @dbname varchar(100)
insert into #databases
select name, convert(sysname,DatabasePropertyEx(name,'Collation')) as collation
from sys.databases
where state <>6
order by name
select @number_of_dbs = count(*) from #databases
select @counter=1
while @counter <= @number_of_dbs
begin
select @dbname = dbname from #databases where dbid=@counter
select @sql= 'insert into #database_collations select ''' + @dbname + ''' as dbname, sc.collation from ' +
@dbname + '..syscolumns sc, ' + @dbname + '..sysobjects so, ' + @dbname + '..systypes st
where so.id=sc.id
and so.type=''U''
and st.xtype=sc.xtype
and sc.xtype in (select xtype from systypes
where name in (''char'',''nchar'',''nvarchar'',''varchar''))
and so.name not like ''dt%''
group by sc.collation'
exec (@sql)
select @sql= ' insert into #database_collations_by_column select ''' + @dbname +
''' as dbname, sc.name , sc.collation '+
' from ' +
@dbname + '..syscolumns sc, ' + @dbname + '..sysobjects so, ' + @dbname + '..systypes st
where so.id=sc.id
and so.type=''U''
and st.xtype=sc.xtype
and sc.xtype in (select xtype from systypes
where name in (''char'',''nchar'',''nvarchar'',''varchar''))
and so.name not like ''dt%''
group by sc.name, sc.collation'
exec (@sql)
select @counter=@counter+1
end
select 'the ' + dbname + ' database has more than one collation' as 'multiple collations in one database check'
into #different_collations
from #database_collations
group by dbname
having count(*)>1
if @@rowcount=0
begin
select 'there are no databases with different collations within'
as 'multiple collations in one database check'
end
else
begin
select * from #different_collations
end
-- databases with column collations different from database collation
select 'the ' + dc.colname + ' column collation (' + dc.collation + ') in the '+ dc.dbname +
' database does not match the database collation (' + d.collation + ')'
as 'database v column collation check'
into #column_collations
from #database_collations_by_column dc, #databases d
where dc.dbname=d.dbname
and dc.collation<>d.collation
if @@rowcount=0
begin
select 'there are no databases that have columns that do not match its database collation'
as 'database v column collation check'
end
else
begin
select * from #column_collations
end
-- tidy up
drop table #databases
drop table #column_collations
drop table #database_collations
drop table #different_collations
drop table #database_collations_by_column
go
exec sp_collation_checker