Script to Change Collation of User Database
1. load the script called Generate Change Column Collation
Ensure that the Collation setting at the top is correct
Run it against the Database
Save the results as 01_Change_Column_Collation.SQL
2. Load the Script called Generate Primary Key Constraints
Run it against the database
Save the results as 02_Create_PK.SQL
3. Load the Script called Generate Alternate Key Indexes
Run it against the database
Save the results as 03_Create_AK.SQL
4. Load the Script called Generate Foreign Key Constraints
Run it against the database
Save the results as 04_Create_FK.SQL
5. Load the Script called Generate Check Constraints
Run it against the database
Save the results as 05_Create_CK.SQL
6. Load the Script called Drop Check Constraints
Run it against the database
7. Load the Script called Drop Foreign Key Constraints
Run it against the database
8. Load the Script called Drop Alternate Key Indexes
Run it against the database
9. Load the Script called Drop Primary Key Constraints
Run it against the database
10. enter the following commands
USE MASTER
ALTER DATABASE xxxxx COLLATE xxxxxxxxxxx
11. Load the Script called 01_Change_Column_Collation.SQL
Run it against the database
12. Load the Script called 02_Create_PK.SQL
Run it against the database
13. Load the Script called 03_Create_AK.SQL
Run it against the database
14. Load the Script called 04_Create_FK.SQL
Run it against the database
15. Load the Script called 05_Create_CK.SQL
Run it against the database
AND NOW THE SCRIPTS
Generate Change Column Collation
declare @toCollation sysname
SET @toCollation = ‘Latin1_General_CI_AS’ — Database default collate
SELECT ‘ALTER TABLE ‘ + INFORMATION_SCHEMA.COLUMNS.TABLE_NAME +
‘ ALTER COLUMN ‘ + COLUMN_NAME + ‘ ‘ + DATA_TYPE +
CASE WHEN CHARACTER_MAXIMUM_LENGTH = -1 then ‘(max)’
WHEN DATA_TYPE in (‘text’,’ntext’) then ”
WHEN CHARACTER_MAXIMUM_LENGTH IS NOT NULL
THEN ‘(‘+(CONVERT(VARCHAR,CHARACTER_MAXIMUM_LENGTH)+’)’ )
ELSE isnull(CONVERT(VARCHAR,CHARACTER_MAXIMUM_LENGTH),’ ‘) END
+’ COLLATE ‘ + @toCollation+ ‘ ‘ + CASE IS_NULLABLE
WHEN ‘YES’ THEN ‘NULL’
WHEN ‘No’ THEN ‘NOT NULL’
END
FROM INFORMATION_SCHEMA.COLUMNS INNER JOIN INFORMATION_SCHEMA.TABLES
ON INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = INFORMATION_SCHEMA.TABLES.TABLE_NAME
AND INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA = INFORMATION_SCHEMA.TABLES.TABLE_SCHEMA
WHERE DATA_TYPE IN (‘varchar’ ,’char’,’nvarchar’,’nchar’,’text’,’ntext’)
AND TABLE_TYPE = ‘BASE TABLE’
and COLLATION_NAME <> @toCollation
Generate_Primary_Key_Contraints
BEGIN TRAN
— Get all existing primary keys
DECLARE cPK CURSOR FOR
SELECT so.name,si.name,si.type_desc
from sys.indexes si
join sys.objects so
on si.object_id = so.object_id
and so.type = ‘U’
where si.type_desc <> ‘HEAP’
and si.is_Primary_Key = 1
ORDER BY so.Name
DECLARE @PkTable SYSNAME
DECLARE @PkName SYSNAME
Declare @KeyType nvarchar(50)
— Loop through all the primary keys
OPEN cPK
FETCH NEXT FROM cPK INTO @PkTable, @PkName,@KeyType
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE @PKSQL NVARCHAR(4000) SET @PKSQL = ”
SET @PKSQL = ‘ALTER TABLE ‘ + @PkTable + ‘ ADD CONSTRAINT ‘ + @PkName + ‘ PRIMARY KEY ‘ + @KeyType + ‘ (‘
— Get all columns for the current primary key
DECLARE cPKColumn CURSOR FOR
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = @PkTable AND CONSTRAINT_NAME = @PkName
ORDER BY ORDINAL_POSITION
OPEN cPKColumn
DECLARE @PkColumn SYSNAME
DECLARE @PkFirstColumn BIT SET @PkFirstColumn = 1
— Loop through all columns and append the sql statement
FETCH NEXT FROM cPKColumn INTO @PkColumn
WHILE (@@FETCH_STATUS = 0)
BEGIN
IF (@PkFirstColumn = 1)
SET @PkFirstColumn = 0
ELSE
SET @PKSQL = @PKSQL + ‘, ‘
SET @PKSQL = @PKSQL + @PkColumn
FETCH NEXT FROM cPKColumn INTO @PkColumn
END
CLOSE cPKColumn
DEALLOCATE cPKColumn
SET @PKSQL = @PKSQL + ‘)’
— Print the primary key statement
PRINT @PKSQL
FETCH NEXT FROM cPK INTO @PkTable, @PkName, @KeyType
END
CLOSE cPK
DEALLOCATE cPK
ROLLBACK
Generate_Alternate_Key_Indexes
BEGIN TRAN
— Get all existing primary keys
DECLARE cPK CURSOR FOR
select si.Object_id,si.Index_Id,so.name,si.name,si.type_desc,si.is_unique from sys.indexes si
join sys.objects so
on so.object_id = si.object_id
and so.type = ‘U’
and si.is_Primary_key = 0
and si.type_desc <> ‘HEAP’
order by so.name
Declare @ObjectID int
Declare @IndexID int
Declare @TableName nvarchar(50)
Declare @IndexName nvarchar(50)
declare @IndexType nvarchar(50)
declare @IndexUnique bit
— Loop through all the primary keys
OPEN cPK
FETCH NEXT FROM cPK INTO @ObjectID,@IndexId,@TableName,@IndexName,@indexType,@IndexUnique
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE @PKSQL NVARCHAR(4000) SET @PKSQL = ”
Declare @KeyUnique nvarchar(10) set @KeyUnique = ”
if @IndexUnique = 1 set @KeyUnique = ‘Unique’
SET @PKSQL = ‘Create ‘ + @KeyUnique + ‘ ‘ + @IndexType + ‘ INDEX ‘ + @IndexName + ‘ ON ‘ + @TableName + ‘ (‘
— Get all columns for the current key
DECLARE cPKColumn CURSOR FOR
select sc.name
from sys.index_Columns sic
join sys.columns sc
on sc.object_id = sic.object_id
and sc.column_id = sic.column_id
where sic.object_id = @ObjectID
and sic.Index_id = @IndexID
OPEN cPKColumn
DECLARE @PkColumn SYSNAME
DECLARE @PkFirstColumn BIT SET @PkFirstColumn = 1
— Loop through all columns and append the sql statement
FETCH NEXT FROM cPKColumn INTO @PkColumn
WHILE (@@FETCH_STATUS = 0)
BEGIN
IF (@PkFirstColumn = 1)
SET @PkFirstColumn = 0
ELSE
Begin
SET @PKSQL = @PKSQL + ‘, ‘
end
SET @PKSQL = @PKSQL + @PkColumn
FETCH NEXT FROM cPKColumn INTO @PkColumn
END
CLOSE cPKColumn
DEALLOCATE cPKColumn
SET @PKSQL = @PKSQL + ‘)’
— Print the primary key statement
PRINT @PKSQL
FETCH NEXT FROM cPK INTO @ObjectID,@IndexId,@TableName,@IndexName,@indexType,@IndexUnique
END
CLOSE cPK
DEALLOCATE cPK
ROLLBACK
Generate Foreign Key Constraints
BEGIN TRAN
— Get all existing primary keys
DECLARE cPK CURSOR FOR
select sf.object_id,sf.name,so.name,sor.name from sys.foreign_keys sf
join sys.objects so
on so.object_id = sf.parent_object_id
join sys.objects sor
on sor.object_id = sf.referenced_object_id
ORDER BY sf.Name
DECLARE @PkTable SYSNAME
DECLARE @PkName SYSNAME
Declare @RefName nvarchar(50)
declare @objectid bigint
— Loop through all the primary keys
OPEN cPK
FETCH NEXT FROM cPK INTO @objectid,@PkName,@PkTable, @refName
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE @PKSQL NVARCHAR(4000) SET @PKSQL = ”
Declare @FKSQL Nvarchar(4000) set @fkSQL = ”
SET @PKSQL = ‘ALTER TABLE ‘ + @PkTable + ‘ WITH NOCHECK ADD CONSTRAINT ‘ + @PkName + ‘ Foreign KEY ‘ + ‘ (‘
Set @FKSQL = ‘ REFERENCES ‘ + @RefName + ‘ (‘
— Get all columns for the current primary key
DECLARE cPKColumn CURSOR FOR
select so.name,sor.name from sys.foreign_key_columns sfc
join sys.columns so
on so.column_id = sfc.parent_column_id
and so.object_Id = sfc.parent_object_id
join sys.columns sor
on sor.column_id = sfc.referenced_column_id
and sor.object_id = sfc.referenced_object_id
where sfc.Constraint_object_id = @ObjectID
OPEN cPKColumn
DECLARE @PkColumn SYSNAME
Declare @fkColumn sysname
DECLARE @PkFirstColumn BIT SET @PkFirstColumn = 1
— Loop through all columns and append the sql statement
FETCH NEXT FROM cPKColumn INTO @PkColumn,@fkColumn
WHILE (@@FETCH_STATUS = 0)
BEGIN
IF (@PkFirstColumn = 1)
SET @PkFirstColumn = 0
ELSE
Begin
SET @PKSQL = @PKSQL + ‘, ‘
set @FkSQL = @FKSQL + ‘, ‘
end
SET @PKSQL = @PKSQL + @PkColumn
set @FkSql = @FKSQL + @FKColumn
FETCH NEXT FROM cPKColumn INTO @PkColumn,@FKColumn
END
CLOSE cPKColumn
DEALLOCATE cPKColumn
SET @PKSQL = @PKSQL + ‘)’
set @FKSql = @FKSQL + ‘)’
— Print the primary key statement
PRINT @PKSQL
Print @FKSQL
FETCH NEXT FROM cPK INTO @objectid,@PkName,@PkTable, @refName
END
CLOSE cPK
DEALLOCATE cPK
ROLLBACK
Generate Check Constraints
select ‘Alter Table ‘ + st.name + ‘ With Nocheck ‘ + ‘Add Constraint ‘ + scc.name + ‘ check ‘ + scc.definition
from sys.tables st
join sys.check_constraints scc
on st.object_id = scc.parent_object_id
order by st.name
Drop Check Constraints
declare ca Cursor
for select st.name,scc.name
from sys.tables st
join sys.check_constraints scc
on st.object_id = scc.parent_object_id
order by st.name
declare @TableName nvarchar(50)
declare @ConstraintName nvarchar(50)
declare @DbName nvarchar(50)
Declare @Sql nvarchar(4000)
set @dbName = db_name()
open ca
fetch from ca into @TableName,@ConstraintName
While @@Fetch_Status = 0
Begin
set @SQL = ‘use ‘ + db_name() +’ Alter Table ‘ + @TableName + ‘ Drop Constraint ‘ + @ConstraintName + ‘;’
print @sql
exec (@Sql)
fetch from ca into @TableName,@ConstraintName
end
close ca
deallocate ca
Drop Foreign Key Constraints
— Get all existing Foreign keys
DECLARE cPK CURSOR FOR
select sf.object_id,sf.name,so.name,sor.name from sys.foreign_keys sf
join sys.objects so
on so.object_id = sf.parent_object_id
join sys.objects sor
on sor.object_id = sf.referenced_object_id
ORDER BY sf.Name
DECLARE @PkTable SYSNAME
DECLARE @PkName SYSNAME
Declare @RefName nvarchar(50)
declare @objectid bigint
— Loop through all the primary keys
OPEN cPK
FETCH NEXT FROM cPK INTO @objectid,@PkName,@PkTable, @refName
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE @PKSQL NVARCHAR(4000) SET @PKSQL = ”
Declare @FKSQL Nvarchar(4000) set @fkSQL = ”
SET @PKSQL = ‘ALTER TABLE ‘ + @PkTable + ‘ Drop CONSTRAINT ‘ + @PkName
— Print the Drop key statement
PRINT @PKSQL
Exec(@pksql)
FETCH NEXT FROM cPK INTO @objectid,@PkName,@PkTable, @refName
END
CLOSE cPK
DEALLOCATE cPK
Drop Alternate Key Indexes
— Get all existing Alternate keys
DECLARE cPK CURSOR FOR
select si.Object_id,si.Index_Id,so.name,si.name,si.type_desc,si.is_unique from sys.indexes si
join sys.objects so
on so.object_id = si.object_id
and so.type = ‘U’
and si.is_Primary_key = 0
and si.type_desc <> ‘HEAP’
order by so.name
Declare @ObjectID int
Declare @IndexID int
Declare @TableName nvarchar(50)
Declare @IndexName nvarchar(50)
declare @IndexType nvarchar(50)
declare @IndexUnique bit
— Loop through all the primary keys
OPEN cPK
FETCH NEXT FROM cPK INTO @ObjectID,@IndexId,@TableName,@IndexName,@indexType,@IndexUnique
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE @PKSQL NVARCHAR(4000) SET @PKSQL = ”
Declare @KeyUnique nvarchar(10) set @KeyUnique = ”
if @IndexUnique = 1 set @KeyUnique = ‘Unique’
SET @PKSQL = ‘DROP INDEX ‘ + @IndexName + ‘ ON ‘ + @TableName
— Print the Alternate key statement
PRINT @PKSQL
exec (@pksql)
FETCH NEXT FROM cPK INTO @ObjectID,@IndexId,@TableName,@IndexName,@indexType,@IndexUnique
END
CLOSE cPK
DEALLOCATE cPK
Drop Primary Key Constraints
— Get all existing primary keys
DECLARE cPK CURSOR FOR
SELECT TABLE_NAME, CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
Where Constraint_Type = ‘Primary Key’
ORDER BY TABLE_NAME
DECLARE @PkTable SYSNAME
DECLARE @PkName SYSNAME
— Loop through all the primary keys
OPEN cPK
FETCH NEXT FROM cPK INTO @PkTable, @PkName
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE @PKSQL NVARCHAR(4000) SET @PKSQL = ”
SET @PKSQL = ‘use ‘ + db_name() + ‘ ALTER TABLE ‘ + @PkTable + ‘ drop CONSTRAINT ‘ + @PkName
print @PKSQL
exec(@PKSQL)
FETCH NEXT FROM cPK INTO @PkTable, @PkName
END
CLOSE cPK
DEALLOCATE cPK
Referencia: http://www.sqlservercentral.com/Forums/Topic820675-146-1.aspx