Добавление идентификатора в существующий столбец

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

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

какова команда SQL для изменения столбца, чтобы иметь свойство identity?

19 ответов


вы не можете изменить существующие столбцы идентичности.

у вас есть 2 варианта,

  1. создайте новую таблицу с идентификатором и удалите существующую таблицу

  2. создайте новый столбец с идентификатором и удалите существующий столбец

подход 1. (новая таблица) здесь можно сохранить существующие значения данных во вновь созданном столбце identity.

CREATE TABLE dbo.Tmp_Names
    (
      Id int NOT NULL
             IDENTITY(1, 1),
      Name varchar(50) NULL
    )
ON  [PRIMARY]
go

SET IDENTITY_INSERT dbo.Tmp_Names ON
go

IF EXISTS ( SELECT  *
            FROM    dbo.Names ) 
    INSERT  INTO dbo.Tmp_Names ( Id, Name )
            SELECT  Id,
                    Name
            FROM    dbo.Names TABLOCKX
go

SET IDENTITY_INSERT dbo.Tmp_Names OFF
go

DROP TABLE dbo.Names
go

Exec sp_rename 'Tmp_Names', 'Names'

подход 2 (новый колонка) вы не можете сохранить существующие значения данных во вновь созданном столбце идентификатора, столбец идентификатора будет содержать последовательность чисел.

Alter Table Names
Add Id_new Int Identity(1, 1)
Go

Alter Table Names Drop Column ID
Go

Exec sp_rename 'Names.Id_new', 'ID', 'Column'

дополнительные сведения см. В следующем сообщении форума Microsoft SQL Server:

как изменить столбец на identity (1,1)


в SQL 2005 и выше, есть трюк, чтобы решить эту проблему без изменения страниц данных таблицы. Это важно для больших таблиц, где прикосновение к каждой странице данных может занять минуты или часы. Трюк также работает, даже если столбец идентификаторов является первичным ключом, является частью кластеризованного или некластеризованного индекса или других gotchas, которые могут задействовать более простое решение "добавить/удалить/переименовать столбец".

вот трюк: вы можете использовать SQL Server ALTER ТАБЛИЦА...Переключатель инструкция для изменения схемы таблицы без изменения данных, то есть вы можете заменить таблицу идентификатором с идентичной схемой таблицы, но без столбца идентификатора. Тот же трюк работает, чтобы добавить IDENTITY в существующий столбец.

как правило, ИЗМЕНИТЬ ТАБЛИЦУ...Переключатель используется для эффективной замены полного раздела В секционированной таблице новым пустым разделом. Но его также можно использовать в несекционированных таблицах тоже.

я использовал этот трюк, чтобы преобразовать, менее чем за 5 секунд, столбец таблицы строк 2,5 миллиарда из IDENTITY в non-IDENTITY (для запуска многочасового запроса, план запроса которого работал лучше для столбцов non-IDENTITY), а затем восстановил параметр IDENTITY, снова менее чем за 5 секунд.

вот пример кода, как это работает.

 CREATE TABLE Test
 (
   id int identity(1,1),
   somecolumn varchar(10)
 );

 INSERT INTO Test VALUES ('Hello');
 INSERT INTO Test VALUES ('World');

 -- copy the table. use same schema, but no identity
 CREATE TABLE Test2
 (
   id int NOT NULL,
   somecolumn varchar(10)
 );

 ALTER TABLE Test SWITCH TO Test2;

 -- drop the original (now empty) table
 DROP TABLE Test;

 -- rename new table to old table's name
 EXEC sp_rename 'Test2','Test';

 -- update the identity seed
 DBCC CHECKIDENT('Test');

 -- see same records
 SELECT * FROM Test; 

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

  • насколько я знаю, самосознание-это единственное, что вы можете изменить столбцы таблицы с помощью этого метода. Добавление / удаление столбцов, изменение nullability и т. д. не допускается.
  • вам нужно будет удалить foriegn ключи, прежде чем сделать переключатель и восстановить их после.
  • то же самое для функций SCHEMABINDING, представлений и т. д.
  • индексы новой таблицы должны точно совпадать (те же столбцы, тот же порядок и т. д.)
  • старые и новые таблицы должны быть в одной файловой группе.
  • работает только на SQL Server 2005 или более поздней
  • я ранее считал, что этот трюк работает только на корпоративных или разработчиков выпусков SQL Server (потому что разделы поддерживаются только в корпоративных и разработчиков версий), но Мейсон г. Жвити в своем комментарии ниже говорит, что он также работает в SQL Standard Edition тоже. Я предполагаю, что это означает, что ограничение на Enterprise или Разработчик не применяется к ALTER TABLE...ПЕРЕКЛЮЧАТЕЛЬ.

хороший статья на TechNet детализировать требования выше.

обновление - Эрик Ву был комментарий ниже, который добавляет важную информацию об этом решении. Копирую его здесь, чтобы убедиться, что он получает больше внимания:

здесь есть еще одно предостережение, которое стоит упомянуть. Хотя новая таблица с радостью получит данные из старой таблицы, и все этот новые строки будут вставлены после шаблона идентификатора, они будут начните с 1 и потенциально сломайте, если указанный столбец является первичным ключом. Используйте DBCC CHECKIDENT('<newTableName>') сразу после переключение. См.msdn.microsoft.com/en-us/library/ms176057.aspx Для больше информация.

если таблица активно расширяется новыми строками (это означает, что у вас мало времени простоя между добавлением идентификатора и добавлением новых строк, а не DBCC CHECKIDENT вы хотите чтобы вручную установить значение Identity seed в новой схеме таблицы больше, чем самый большой существующий ID в таблице, например IDENTITY (2435457, 1). Возможно, вы сможете включить оба ALTER TABLE...SWITCH и DBCC CHECKIDENT в транзакции (или нет-- не тестировали это), но, похоже, установка начального значения вручную будет проще и безопаснее.

очевидно, что если в таблицу не добавляются новые строки (или они добавляются только изредка, как ежедневный процесс ETL) , то это условие гонки не произойдет так DBCC CHECKIDENT - это хорошо.


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

ALTER TABLE (yourTable) ADD NewColumn INT IDENTITY(1,1)

ALTER TABLE (yourTable) DROP COLUMN OldColumnName

EXEC sp_rename 'yourTable.NewColumn', 'OldColumnName', 'COLUMN'

Марк


здесь описано классное решение: SQL SERVER-добавление или удаление свойства Identity в столбце

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

Это огромная экономия времени, потому что он (скрипт) содержит все внешние ключи, индексы и т. д. связано с таблицей, которую вы меняете. Запишите это вручную... Бог запретить.


простое объяснение

переименуйте существующий столбец с помощью sp_RENAME

Exec и процедуру sp_rename 'Имя_таблицы.Existing_ColumnName', 'New_ColumnName', 'COLUMN'

пример для переименования :

существующий идентификатор пользователя столбца переименован в OldUserID

EXEC sp_RENAME 'AdminUsers.UserID' , 'OldUserID', 'COLUMN'

затем добавьте новый столбец, используя alter query, чтобы установить в качестве первичного ключа и значения идентификатора

ALTER TABLE TableName ADD Old_ColumnName INT NOT NULL PRIMARY KEY IDENTITY(1,1)

пример для первичного набора ключ

новое созданное имя столбца-UserID

ALTER TABLE Users ADD UserID INT NOT NULL PRIMARY KEY IDENTITY(1,1)

затем отбросьте переименованный столбец

ALTER TABLE Table_Name DROP COLUMN Renamed_ColumnName

пример для Drop переименованный столбец

ALTER TABLE Users DROP COLUMN OldUserID

теперь мы добавили primarykey и identity в существующий столбец таблицы.


в sql server 2014 (я не знаю о более низких версиях) вы можете сделать это просто, используя последовательность.

CREATE SEQUENCE  sequence_name START WITH here_higher_number_than_max_existed_value_in_column INCREMENT BY 1;

ALTER TABLE table_name ADD CONSTRAINT constraint_name DEFAULT NEXT VALUE FOR sequence_name FOR column_name

отсюда: последовательности, как значение по умолчанию для столбца


Я разработчик java, который попал в команду без DBA и тот, где как разработчик, я не могу получить права DBA. Мне было поручено переместить всю схему между двумя базами данных, поэтому без DBA я должен был сделать это и сделать это, запустив скрипты, не имея возможности использовать GUI в SQL Server 2008, потому что у меня не было прав администратора.

все было перемещено без проблем, однако при запуске хранимой процедуры в новой схеме.стол, я обнаружил, что потерял ... поле идентификатора в таблице. Я дважды проверил сценарий, который создал таблицу, и он был там, однако SQL Server не получил его при запуске сценария. Позже мне сказал DBA, что он видел эту же проблему раньше.

в любом случае, для SQL Server 2008 это шаги, которые я предпринял, чтобы решить эту проблему, и они работали, поэтому я публикую это здесь в надежде, что это поможет кому-то. Это то, что я сделал, поскольку у меня были ЗАВИСИМОСТИ FK от другой таблицы, которая сделала это больше трудно:

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

1.) Найти статистику по таблице:

exec sp_help 'dbo.table_name_old';

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

3.) Отключите идентификатор для перемещения данных.

SET IDENTITY_INSERT dbo.table_name ON 

4.) Передача данных.

INSERT INTO dbo.table_name_new
(
field1, field2, etc...
)
SELECT 
field1, field2, etc...
FROM 
dbo.table_name_old;

5.) Проверить данные там.

SELECT * FROM dbo.table_name_new

6.) Повторно включите идентификацию.

SET IDENTITY_INSERT ToyRecP.ToyAwards.lkpFile_New OFF

7.) это лучший сценарий, который я нашел, чтобы получить все отношения FK, чтобы проверить, какие таблицы исходные ссылки на таблицы Как зависимости и я наткнулся на многих, так что это хранитель!

SELECT f.name AS ForeignKey,
   OBJECT_NAME(f.parent_object_id) AS TableName,
   COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
   OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
   COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc
   ON f.OBJECT_ID = fc.constraint_object_id
   ORDER BY ReferenceTableName;

8.) Перед следующим шагом убедитесь, что у вас есть все сценарии PK и FK для всех задействованных таблиц.

9.) Вы можете щелкнуть правой кнопкой мыши по каждому ключу и написать это, используя SQL Server 2008

10.) Удалите FK(S) из таблицы зависимостей, используя следующий синтаксис:

ALTER TABLE [dbo].[table_name] DROP CONSTRAINT [Name_of_FK]

11.) Отбросьте исходную таблицу:

DROP TABLE dbo.table_name_old;

13.) Следующие шаги основаны на сценариях, созданных в SQL Server 2008 на шаге 9.

--добавьте ПК в новую таблицу.

--добавьте FK в новую таблицу.

--добавить FK обратно в таблицу зависимостей.

14.) Убедитесь, что все правильно и полно. Я использовал GUI, чтобы посмотреть на таблицы.

15.) Переименовать новую таблицу в исходное имя таблицы.

exec sp_RENAME '[Schema_Name.OldTableName]' , '[NewTableName]';

наконец - то все сработало!


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

Если мы используем SQL Server Management Studio, чтобы избавиться от значения идентификатора в столбце "id", создается новая временная таблица, данные перемещаются во временную таблицу, старая таблица удаляется, а новая таблица переименованный.

используйте Management Studio для внесения изменений, а затем щелкните правой кнопкой мыши в конструкторе и выберите "Создать сценарий изменения".

вы увидите, что это то, что SQL server делает в фоновом режиме.


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

Если вы используете SSMS и задаете свойству identity значение ON в конструкторе, вот что SQL Server делает за кулисами. Поэтому, если у вас есть таблица с именем [user], вот что произойдет, если вы сделаете UserID и identity

BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION

GO

GO
CREATE TABLE dbo.Tmp_User
    (
    UserID int NOT NULL IDENTITY (1, 1),
    LastName varchar(50) NOT NULL,
    FirstName varchar(50) NOT NULL,
    MiddleInitial char(1) NULL

    )  ON [PRIMARY]
GO

SET IDENTITY_INSERT dbo.Tmp_User ON
GO
IF EXISTS(SELECT * FROM dbo.[User])
 EXEC('INSERT INTO dbo.Tmp_User (UserID, LastName, FirstName, MiddleInitial)
    SELECT UserID, LastName, FirstName, MiddleInitialFROM dbo.[User] TABLOCKX')
GO
SET IDENTITY_INSERT dbo.Tmp_User OFF
GO

GO
DROP TABLE dbo.[User]
GO
EXECUTE sp_rename N'dbo.Tmp_User', N'User', 'OBJECT'
GO
ALTER TABLE dbo.[User] ADD CONSTRAINT
    PK_User PRIMARY KEY CLUSTERED 
    (
    UserID
    ) ON [PRIMARY]

GO
COMMIT

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


принятый ответ неверен: вы можете изменить существующий столбец, чтобы быть удостоверение пока это не содержит значения null. После изменения идентификационное семя будет начинаться с max (столбец) + 1.

Итак, что вам действительно нужно сделать сначала, это предоставить значения для всех нулей.


Как я понял в обычных случаях мы создаем таблицу с первичный ключ, которая имеет свойство Identity
Так что переименовать или удалить столбец, который связан с Первичный Ключ ограничения невозможно, поскольку правила ограничений проверяют структуру столбцов.
Чтобы достичь этого, мы должны обработать некоторые шаги следующим образом:
Предположим TableName = "Сотрудник" и ColumnName = 'EmployeeId'

1. Добавить новый столбец "EmployeeId_new" в таблицу " Employee
ALTER TABLE Employee ADD EmployeeId_new int IDENTITY (1,1)

  1. теперь удалите столбец "EmployeeId" из таблицы " Employee
    ALTER таблица сотрудник падение столбец EmployeeId

  2. Это вызовет ошибку из-за того, что правила ограничения первичного ключа применимы и проверка структуры столбцов.
    *### 'Msg 5074, Уровень 16, состояние 1, строка 1 объект [PK_dbo.Сотрудник] зависит от colmn [EmployeeId].'###

  3. поэтому мы должны сначала удалить ограничение первичного ключа из таблицы "сотрудник", затем мы можем удалить столбец
    ALTER TABLE Employee Drop constraint [PK_dbo.Сотрудник]

  4. теперь мы можем удалить столбец "EmployeeId" из Таблица "сотрудник", как и на предыдущем шаге, где мы получили ошибку
    ALTER таблица сотрудник падение столбец EmployeeId

  5. теперь столбец 'EmployeeId' удален из таблицы Поэтому мы переименуем недавно добавленный новый столбец "EmployeeId_new" в "EmployeeId"
    процедура sp_rename '.EmployeeId',' EmployeeId_new','столбец'

  6. чтобы переставить таблицу в том же виде, как она была, мы должны добавить первичный ключ Ограничение для столбца "EmployeeId"
    ALTER TABLE Employee добавить ограничение [PK_dbo.Employee] первичный ключ (EmployeeId)

8. теперь таблица "сотрудник" с "EmployeeId" изменяется для Правил идентификации вместе с существующим ограничением первичного ключа


к сожалению, его нет; свойство IDENTITY принадлежит таблице, а не столбцу.

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

посмотреть здесь для счета удар за ударом.


щелкните правой кнопкой мыши имя таблицы в Обозревателе объектов. Вы получите некоторые варианты. Нажмите "дизайн". Для этой таблицы будет открыта новая вкладка. Вы можете добавить ограничение Identity здесь ,в "свойствах столбца".


чтобы изменить свойства идентификатора для столбца:

  • в Обозревателе серверов щелкните правой кнопкой мыши таблицу со свойствами идентификаторов, которую требуется изменить, и выберите Открыть определение таблицы. Таблица открывается в конструкторе таблиц.
  • снимите флажок Разрешить нули для столбца, который требуется изменить.
  • на вкладке свойства столбца разверните свойство спецификация идентификатора.
  • щелкните ячейку сетки для дочернего свойства is Identity и выберите Да из выпадающего списка.
  • введите значение в ячейку Identity Seed. Это значение будет присвоено первой строке таблицы. Значение 1 будет присвоено по умолчанию.

вот и все, и это сработало для меня


если исходный плакат действительно хотел установить существующий столбец как PRIMARY KEY для таблицы и на самом деле не нужно, чтобы столбец был IDENTITY столбец (две разные вещи), то это можно сделать через t-SQL с:

ALTER TABLE [YourTableName]
ADD CONSTRAINT [ColumnToSetAsPrimaryKey] PRIMARY KEY ([ColumnToSetAsPrimaryKey])

обратите внимание на скобки вокруг имени столбца после .

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


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

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

--first drop column and add with identity
ALTER TABLE dbo.tblProductPriceList drop column ID 
ALTER TABLE dbo.tblProductPriceList add ID INT IDENTITY(1,1)

--then add primary key to that column (exist option you can ignore)
IF  NOT EXISTS (SELECT * FROM sys.key_constraints  WHERE object_id = OBJECT_ID(N'[dbo].[PK_tblProductPriceList]') AND parent_object_id = OBJECT_ID(N'[dbo].[tblProductPriceList]'))
    ALTER TABLE [tblProductPriceList] ADD PRIMARY KEY (id)
GO

это создаст тот же столбец первичного ключа с идентификатором

Я этой ссылки : https://blog.sqlauthority.com/2014/10/11/sql-server-add-auto-incremental-identity-column-to-table-after-creating-table/

добавить первичный ключ к существующей таблице


Я не верю, что вы можете изменить существующий столбец как столбец идентификаторов с помощью tsql. Однако это можно сделать с помощью представления проектирования Enterprise Manager.

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

ALTER TABLE FooTable
ADD BarColumn INT IDENTITY(1, 1)
               NOT NULL
               PRIMARY KEY CLUSTERED

в основном есть четыре логических шага.

  1. создайте новый столбец идентификаторов. Включите Insert Identity для этого нового столбца.

  2. вставьте данные из исходного столбца (столбца, который вы хотите преобразовать в идентификатор) в этот новый столбец.

  3. выключите идентификатор вставки для нового столбца.

  4. удалите исходный столбец и переименуйте новый столбец В имя источника колонна.

могут быть некоторые более сложные проблемы, такие как работа на нескольких серверах и т. д.

пожалуйста, обратитесь к следующей статье для шагов (с помощью ssms & T-sql). Эти шаги предназначены для начинающих с меньшим сцеплением с T-SQL.

http://social.technet.microsoft.com/wiki/contents/articles/23816.how-to-convert-int-column-to-identity-in-the-ms-sql-server.aspx


создает скрипт для всех таблиц с первичным ключом = bigint, которые не имеют набора идентификаторов; это вернет список сгенерированных скриптов с каждой таблицей;

SET NOCOUNT ON;

declare @sql table(s varchar(max), id int identity)

DECLARE @table_name nvarchar(max),
        @table_schema nvarchar(max);

DECLARE vendor_cursor CURSOR FOR 
SELECT
  t.name, s.name
FROM sys.schemas AS s
INNER JOIN sys.tables AS t
  ON s.[schema_id] = t.[schema_id]
WHERE EXISTS (
    SELECT
    [c].[name]
    from sys.columns [c]
    join sys.types [y] on [y].system_type_id = [c].system_type_id
    where [c].[object_id] = [t].[object_id] and [y].name = 'bigint' and [c].[column_id] = 1
) and NOT EXISTS 
(
  SELECT 1 FROM sys.identity_columns
    WHERE [object_id] = t.[object_id]
) and exists (
    select 1 from sys.indexes as [i] 
    inner join sys.index_columns as [ic]  ON  i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id
    where object_name([ic].[object_id]) = [t].[name]
)
OPEN vendor_cursor

FETCH NEXT FROM vendor_cursor 
INTO @table_name, @table_schema

WHILE @@FETCH_STATUS = 0
BEGIN

DELETE FROM @sql

declare @pkname varchar(100),
    @pkcol nvarchar(100)

SELECT  top 1
        @pkname = i.name,
        @pkcol = COL_NAME(ic.OBJECT_ID,ic.column_id)
FROM    sys.indexes AS [i]
INNER JOIN sys.index_columns AS [ic] ON  i.OBJECT_ID = ic.OBJECT_ID AND i.index_id = ic.index_id
WHERE   i.is_primary_key = 1 and OBJECT_NAME(ic.OBJECT_ID) = @table_name

declare @q nvarchar(max) = 'SELECT  '+@pkcol+' FROM ['+@table_schema+'].['+@table_name+'] ORDER BY '+@pkcol+' DESC'

DECLARE @ident_seed nvarchar(max) -- Change this to the datatype that you are after
SET @q = REPLACE(@q, 'SELECT', 'SELECT TOP 1 @output = ')
EXEC sp_executeSql @q, N'@output bigint OUTPUT', @ident_seed OUTPUT

insert into  @sql(s) values ('BEGIN TRANSACTION')
insert into  @sql(s) values ('BEGIN TRY')

-- create statement
insert into  @sql(s) values ('create table ['+@table_schema+'].[' + @table_name + '_Temp] (')

-- column list
insert into @sql(s) 
select 
    '  ['+[c].[name]+'] ' +
    y.name + 

    (case when [y].[name] like '%varchar' then
    coalesce('('+(case when ([c].[max_length] < 0 or [c].[max_length] >= 1024) then 'max' else cast([c].max_length as varchar) end)+')','')
    else '' end)

     + ' ' +
    case when [c].name = @pkcol then 'IDENTITY(' +COALESCE(@ident_seed, '1')+',1)' else '' end + ' ' +
    ( case when c.is_nullable = 0 then 'NOT ' else '' end ) + 'NULL ' + 
    coalesce('DEFAULT ('+(
        REPLACE(
            REPLACE(
                LTrim(
                    RTrim(
                        REPLACE(
                            REPLACE(
                                REPLACE(
                                    REPLACE(
                                        LTrim(
                                            RTrim(
                                                REPLACE(
                                                    REPLACE(
                                                        object_definition([c].default_object_id)
                                                    ,' ','~')
                                                ,')',' ')
                                            )
                                        )
                                    ,' ','*')
                                ,'~',' ')
                            ,' ','~')
                        ,'(',' ')
                    )
                )
            ,' ','*')
        ,'~',' ')
    ) +
    case when object_definition([c].default_object_id) like '%get%date%' then '()' else '' end
    +
    ')','') + ','
 from sys.columns c
 JOIN sys.types y ON y.system_type_id = c.system_type_id
  where OBJECT_NAME(c.[object_id]) = @table_name and [y].name != 'sysname'
 order by [c].column_id


 update @sql set s=left(s,len(s)-1) where id=@@identity

-- closing bracket
insert into @sql(s) values( ')' )

insert into @sql(s) values( 'SET IDENTITY_INSERT ['+@table_schema+'].['+@table_name+'_Temp] ON')

declare @cols nvarchar(max)
SELECT @cols = STUFF(
    (
        select ',['+c.name+']'
        from sys.columns c
        JOIN sys.types y ON y.system_type_id = c.system_type_id
        where c.[object_id] = OBJECT_ID(@table_name)
        and [y].name != 'sysname'
        and [y].name != 'timestamp'
        order by [c].column_id
        FOR XML PATH ('')
     )
    , 1, 1, '')

insert into @sql(s) values( 'IF EXISTS(SELECT * FROM ['+@table_schema+'].['+@table_name+'])')
insert into @sql(s) values( 'EXEC(''INSERT INTO ['+@table_schema+'].['+@table_name+'_Temp] ('+@cols+')')
insert into @sql(s) values( 'SELECT '+@cols+' FROM ['+@table_schema+'].['+@table_name+']'')')

insert into @sql(s) values( 'SET IDENTITY_INSERT ['+@table_schema+'].['+@table_name+'_Temp] OFF')


insert into @sql(s) values( 'DROP TABLE ['+@table_schema+'].['+@table_name+']')

insert into @sql(s) values( 'EXECUTE sp_rename N''['+@table_schema+'].['+@table_name+'_Temp]'', N'''+@table_name+''', ''OBJECT''')

if ( @pkname is not null ) begin
    insert into @sql(s) values('ALTER TABLE ['+@table_schema+'].['+@table_name+'] ADD CONSTRAINT ['+@pkname+'] PRIMARY KEY CLUSTERED (')
    insert into @sql(s)
        select '  ['+COLUMN_NAME+'] ASC,' from information_schema.key_column_usage
        where constraint_name = @pkname
        GROUP BY COLUMN_NAME, ordinal_position
        order by ordinal_position

    -- remove trailing comma
    update @sql set s=left(s,len(s)-1) where id=@@identity
    insert into @sql(s) values ('  )')
end

insert into  @sql(s) values ('--Run your Statements')
insert into  @sql(s) values ('COMMIT TRANSACTION')
insert into  @sql(s) values ('END TRY')
insert into  @sql(s) values ('BEGIN CATCH')
insert into  @sql(s) values ('        ROLLBACK TRANSACTION')
insert into  @sql(s) values ('        DECLARE @Msg NVARCHAR(MAX)  ')
insert into  @sql(s) values ('        SELECT @Msg=ERROR_MESSAGE() ')
insert into  @sql(s) values ('        RAISERROR(''Error Occured: %s'', 20, 101,@msg) WITH LOG')
insert into  @sql(s) values ('END CATCH')

declare @fqry nvarchar(max)

-- result!
SELECT @fqry = (select char(10) + s from @sql order by id FOR XML PATH (''))


SELECT @table_name as [Table_Name], @fqry as [Generated_Query]
PRINT 'Table: '+@table_name
EXEC sp_executeSql @fqry

    FETCH NEXT FROM vendor_cursor 
    INTO @table_name, @table_schema
END 
CLOSE vendor_cursor;
DEALLOCATE vendor_cursor;