2009-03-31 19 views
17

Есть ли простой способ удалить идентификатор из таблицы в SQL Server 2005?SQL Server как удалить идентификатор из столбца

Когда я использую Management Studio, он создает скрипт, который создает зеркальную таблицу без идентификатора, копирует данные, удаляет таблицу, затем переименовывает зеркальную таблицу и т. Д. Этот скрипт имеет 5231 строку, потому что эта таблица/столбец имеют много отношений FK.

Я бы чувствовал себя гораздо более комфортно, выполняя простой альтер-перепад. Есть идеи?

EDIT
Я думаю, я просто хочу, чтобы пойти со скриптом 5231 строки из Enterprise Manager. Тем не менее, я собираюсь разбить его на более мелкие части, которые я могу запустить и лучше контролировать. Эта таблица «ведет себя» странно, если вы пытаетесь удалить 1 строку (даже вы только что вставили, который не находится в какой-либо другой таблице FK), вы получите эту ошибку:

delete MyTable where MyPrimaryKey=1234 

Msg 8621, Level 17, State 2, Line 1 
    The query processor ran out of stack space during query optimization. Please simplify the query. 

Без сомнения, все FKs. Мы прекратим доступ к нашему приложению и запустим его в однопользовательском режиме, когда мы внесем эту схему и связанные с ней изменения приложения. Тем не менее, нам нужно, чтобы это работало быстро, и мне нужно понять, сколько времени это займет. Я предполагаю, что мне просто нужно будет протестировать, протестировать, протестировать.

ответ

28

Если вы находитесь на SQL Server 2005 или более поздней версии, вы можете сделать это как простое изменение метаданных (NB: не требует издания, поддерживающего разделение, как я изначально указал).

Пример кода, бесстыдно украденного из обходного пути Пола Уайта на this Microsoft Connect Item.

USE tempdb; 
GO 
-- A table with an identity column 
CREATE TABLE dbo.Source 
(row_id INTEGER IDENTITY PRIMARY KEY NOT NULL, data SQL_VARIANT NULL); 
GO 
-- Some sample data 
INSERT dbo.Source (data) 
VALUES (CONVERT(SQL_VARIANT, 4)), 
     (CONVERT(SQL_VARIANT, 'X')), 
     (CONVERT(SQL_VARIANT, {d '2009-11-07'})), 
     (CONVERT(SQL_VARIANT, N'áéíóú')); 
GO 
-- Remove the identity property 
BEGIN TRY; 
    -- All or nothing 
    BEGIN TRANSACTION; 

    -- A table with the same structure as the one with the identity column, 
    -- but without the identity property 
    CREATE TABLE dbo.Destination 
    (row_id INTEGER PRIMARY KEY NOT NULL, data SQL_VARIANT NULL); 

    -- Metadata switch 
    ALTER TABLE dbo.Source SWITCH TO dbo.Destination; 

    -- Drop the old object, which now contains no data 
    DROP TABLE dbo.Source; 

    -- Rename the new object to make it look like the old one 
    EXECUTE sp_rename N'dbo.Destination', N'Source', 'OBJECT'; 

    -- Success 
    COMMIT TRANSACTION; 
END TRY 
BEGIN CATCH 
    -- Bugger! 
    IF XACT_STATE() <> 0 ROLLBACK TRANSACTION; 
    PRINT ERROR_MESSAGE(); 
END CATCH; 
GO 

-- Test the the identity property has indeed gone 
INSERT dbo.Source (row_id, data) 
VALUES (5, CONVERT(SQL_VARIANT, N'This works!')) 

SELECT row_id, 
     data 
FROM dbo.Source; 
GO 

-- Tidy up 
DROP TABLE dbo.Source; 
+1

Это потрясающее решение! –

+0

Ничего себе! Красивый! –

+1

Надеюсь на это целую вечность! +99 если бы я мог :) – MPritchard

5

Вы можете добавить столбец в таблицу, которая не является столбцом идентификации, скопировать данные, удалить исходный столбец и переименовать новый столбец в старый столбец и воссоздать индексы.

Here - ссылка, которая показывает пример. Все еще не простой вариант, но это, безусловно, лучше, чем 5231 строки.

+0

это почти то же самое, что и скрипт Studio Studio Studio 5231, но поскольку для этого нет реального способа «изменить таблицу», это выглядит как хорошая ставка. –

7

Я не верю, что вы можете напрямую удалить часть IDENTITY в столбце. Лучше всего, вероятно:

  • добавить еще один столбец, не тождественный к столу
  • копировать значение идентификаторов в этот столбец
  • уронить оригинальный столбец идентификаторов
  • переименовать новый столбец, чтобы заменить оригинальная колонка

Если столбец идентификационной информации является частью ключа или другого ограничения, вам необходимо будет удалить эти ограничения и повторно создать их после завершения вышеуказанных операций.

Смежные вопросы