У меня есть большая база данных с uniqueidentifier
кластеризованным первичным ключом на каждой его таблице. Я хочу удалить кластерные индексы из первичных ключей и поместить их в столбец идентификаторов в каждой таблице.Как преобразовать все первичные ключи из кластеризованного в некластерный в SQL Server
Когда я хочу удалить кластерные индексы, первичный ключ также будет удален. Поэтому я снова должен создать первичные ключи. сценарий, который я написал, не работает. Пожалуйста, помогите мне
------------drop all clustered primary keys and add nonclustered primary keys-------
DECLARE @table NVARCHAR(512), @tablename NVARCHAR(512),
@sql NVARCHAR(MAX), @sql2 NVARCHAR(MAX), @sql3 NVARCHAR(MAX),
@column NVARCHAR(MAX);
SELECT name As 'Table'
INTO #Indexes
FROM sys.tables
WHERE name like 'webware%'
WHILE (SELECT COUNT(*) FROM #Indexes) > 0
BEGIN
SET @table = (SELECT TOP 1 [Table] FROM #Indexes)
SET @column = (SELECT c.name
FROM sys.tables t
INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
INNER JOIN sys.indexes i ON i.object_id = t.object_id
INNER JOIN sys.index_columns ic ON ic.object_id = t.object_id
INNER JOIN sys.columns c ON c.object_id = t.object_id
AND ic.column_id = c.column_id
WHERE i.is_primary_key = 1
AND t.name = @table)
DECLARE @indexname NVARCHAR(512);
SET @indexname = (SELECT i.name
FROM sys.tables t
INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
INNER JOIN sys.indexes i ON i.object_id = t.object_id
INNER JOIN sys.index_columns ic ON ic.object_id = t.object_id
INNER JOIN sys.columns c ON c.object_id = t.object_id
AND ic.column_id = c.column_id
WHERE i.is_primary_key = 1
AND t.name = @table)
SET @sql = 'ALTER TABLE ' + @table + ' DROP CONSTRAINT ' + @indexname
SET @sql2 = 'DROP INDEX ' + @indexname + ' ON ' + @table
SET @sql3 ='ALTER TABLE ' + @table + ' ADD CONSTRAINT ' + @indexname+ ' PRIMARY KEY NONCLUSTERED(' + @column +')'
EXEC (@sql);
EXEC (@sql2);
EXEC (@sql3);
DELETE FROM #Indexes WHERE [Table] = @table;
END
DROP TABLE #Indexes
OK - у вас есть много кода здесь, глядя в основном ОК для меня - в чем проблема? Разве это не делает то, что вы хотите? Вы получили сообщение об ошибке? Если да: ** что такое ** ошибка ?? –
есть 2 ошибки. first: Невозможно удалить индекс «WebWare_System_SystemType.PK_WebWare_System_SystemType», потому что он не существует или у вас нет разрешения. –
second: Операция CREATE UNIQUE INDEX завершена, потому что был найден дубликат ключа для имени объекта «dbo.WebWare_Membership_UserInRole» и имени индекса «PK_WebWare_Membership_UserInRole». Значение повторяющегося ключа - (55303843-6d22-4a85-b17f-12826e630cac). Msg 1750, уровень 16, состояние 0, строка 1 Не удалось создать ограничение. См. Предыдущие ошибки. Заявление было прекращено. –