Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Ändern der Sortierung der SQL Server-Datenbank

Sie müssen WITH SCHEMABINDING entfernen aus Ihren Ansichten und Tabellenwertfunktionen. Um sie zu identifizieren, können Sie das INFORMATION_SCHEMA abfragen Ansichten:

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. Sichern Sie zuerst die Datenbank.
  2. Generieren Sie einen ALTER Skript aller schemagebundenen Ansichten und Funktionen.
  3. Löschen Sie die Wörter "WITH SCHEMABINDING " aus dem Skript.
  4. Führen Sie das Skript einige Male aus, bis alle Referenzfehler behoben sind.
  5. Ändern Sie die Sortierung in Ihrer Datenbank.
  6. Schreiben Sie alle Einschränkungen (Schlüssel, Prüfungen und Standardwerte) und löschen Sie sie.
  7. Ändern Sie die Sortierung jeder Spalte mit dem folgenden Skript.
  8. Einschränkungen neu erstellen.
  9. Führen Sie schließlich das ursprüngliche Skript einige Male aus, um die Schemabindung zu aktivieren.

Sie können die Sortierung aller Spalten mit diesem Skript ändern:

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