Changing SQL Server Database sorting

前端 未结 3 1820
予麋鹿
予麋鹿 2020-12-05 16:41

I have a request to change the collation of a SQL Server Database:

ALTER DATABASE solarwind95 collate SQL_Latin1_General_CP1_CI_AS

3条回答
  •  孤城傲影
    2020-12-05 17:27

    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%'
    
    1. First backup the database.
    2. Generate an ALTER script of all schema-bound views and functions.
    3. Delete the words "WITH SCHEMABINDING" from the script.
    4. Run the script a few times, until all reference errors are resolved.
    5. Change the collation on your database.
    6. Script and drop all constraints (keys, checks and defaults).
    7. Change the collation of each column using the script below.
    8. Recreate constraints.
    9. Finally, run the original script a few times to enable schema-binding.

    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
    

提交回复
热议问题