Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Промяна на сортирането на база данни на SQL Server

Ще трябва да премахнете WITH SCHEMABINDING от вашите изгледи и таблични функции. За да ги идентифицирате, можете да направите запитване към INFORMATION_SCHEMA изгледи:

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. Първо архивирайте базата данни.
  2. Генерирайте ALTER скрипт на всички обвързани със схема изгледи и функции.
  3. Изтрийте думите „WITH SCHEMABINDING “ от скрипта.
  4. Стартирайте скрипта няколко пъти, докато всички референтни грешки бъдат разрешени.
  5. Променете сортирането на вашата база данни.
  6. Напишете скрипт и премахнете всички ограничения (ключове, проверки и настройки по подразбиране).
  7. Променете сортирането на всяка колона, като използвате скрипта по-долу.
  8. Пресъздайте ограничения.
  9. Накрая изпълнете оригиналния скрипт няколко пъти, за да активирате свързването на схема.

Можете да промените сортирането на всички колони с този скрипт:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създайте връзка в SQL Server 2017

  2. Брой дни от седмицата в диапазон от дати в TSQL

  3. Защо доставчикът на данни или друга услуга ми връща статус E_FAIL? SQL Native Client

  4. Как NTILE() работи в SQL Server

  5. SQL Server IF срещу IIF():Каква е разликата?