I have a request to change the collation of a SQL Server Database:
ALTER DATABASE solarwind95 collate SQL_Latin1_General_CP1_CI_AS
You'll need to remove WITH SCHEMABINDING
from your views and table-valued functions. To identify them you can query the INFORMATION_SCHEMA
views:
SELECT TABLE_SCHEMA, TABLE_NAME AS VIEW_NAME
FROM INFORMATION_SCHEMA.VIEWS
WHERE VIEW_DEFINITION LIKE '%SCHEMABINDING%'
SELECT ROUTINE_SCHEMA, ROUTINE_NAME
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%SCHEMABINDING%'
ALTER
script of all schema-bound views and functions.WITH SCHEMABINDING
" from the script.You can change the collation of all columns with this script:
DECLARE @collation nvarchar(128)
DECLARE @commands table ([SQL] nvarchar(max))
DECLARE @cursor cursor
DECLARE @sql nvarchar(max)
SET @collation = 'SQL_Latin1_General_CP1_CI_AS'
INSERT @commands ([SQL])
SELECT 'ALTER TABLE ' + QUOTENAME(c.TABLE_SCHEMA) +'.'+ QUOTENAME(c.TABLE_NAME)
+ ' ALTER COLUMN ' + QUOTENAME(c.COLUMN_NAME)
+ ' ' + c.DATA_TYPE
+ ISNULL('(' + LTRIM(STR(c.CHARACTER_MAXIMUM_LENGTH)) + ')', '')
+ ISNULL(' COLLATE ' + @collation, '')
+ ' ' + CASE c.IS_NULLABLE WHEN 'NO' THEN 'NOT ' ELSE '' END + 'NULL'
FROM INFORMATION_SCHEMA.COLUMNS c
INNER JOIN INFORMATION_SCHEMA.TABLES t
ON t.TABLE_SCHEMA = c.TABLE_SCHEMA AND t.TABLE_NAME = c.TABLE_NAME
WHERE t.TABLE_TYPE = 'BASE TABLE'
AND c.COLLATION_NAME <> @collation
SET @cursor = CURSOR FOR SELECT [SQL] FROM @commands
OPEN @cursor
FETCH NEXT FROM @cursor INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @sql
EXEC (@sql)
FETCH NEXT FROM @cursor INTO @sql
END
In this case, even removing schemabinding won't help you
Changing collation requires the steps described in KB 325335
It applies to SQL Server 2000 mainly, but the same principle applies
These will be primary key coulmns that are clustered indexes. With clustered indexes the records are stored in ascending order of the column, if you change the collation of the database then all tables would need to be reordered.