Хранимый процесс для копирования данных таблицы, включая любое значение по умолчанию или данные привязки, через скрипт SQL, работающий на SQL Server - PullRequest
0 голосов
/ 29 сентября 2011

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

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

Примечание. Схема исходной таблицы (aSourceTbl) меняется и может изменяться со временем.

--TEST SETUP 
--Delete the prev tables so test script can be replayed
IF OBJECT_ID('aSourceTbl', 'U') IS NOT NULL 
        DROP TABLE aSourceTbl;

IF OBJECT_ID('aSourceCopyTbl', 'U') IS NOT NULL 
        DROP TABLE aSourceCopyTbl;

--Simple table to demonstrate table copying does not carry over the table constraits
CREATE TABLE [dbo].[aSourceTbl](
    [aValue] [int] NOT NULL,
    [DELETED] [int] NOT NULL
) ON [PRIMARY]

--Add some dummy data
INSERT INTO aSourceTbl (aValue, DELETED) VALUES (1,2);
INSERT INTO aSourceTbl (aValue, DELETED) VALUES (3,4);

--Add constraints of default values of 0 in this case 
ALTER TABLE [dbo].[aSourceTbl] ADD  CONSTRAINT [DF_aSourceTbl_aValue]  DEFAULT ((0)) FOR [aValue]
ALTER TABLE [dbo].[aSourceTbl] ADD  CONSTRAINT [DF_aSourceTbl_DELETED]  DEFAULT ((0)) FOR [DELETED]

--Actual Required SQL script from here down 
--The line below works nicely but does not copy the 2 constraints from the lines above into the new table. 
--TODO QUESTION: Replace line below with the same functionaility + the constraints are also copied into new table
Select * INTO aSourceCopyTbl FROM aSourceTbl

Не могли бы вы мне помочь, предложив подходящий хранимый процесс, который может заменить последнюю строку в приведенном выше фрагменте SQL?Любая помощь с благодарностью:)

Ссылки:

  • Подобный вопрос SO , однако, фокусируется на ограничениях PK.Меня интересуют только ограничения по умолчанию в этом случае.

1 Ответ

2 голосов
/ 30 сентября 2011

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

declare @table_name sysname, @new_table sysname, @cmd varchar(max)
select @table_name = 'SOURCE_TABLE', @cmd = '', @new_table = 'TEST_TABLE'


select @cmd = @cmd+'ALTER TABLE '+@new_table+' ADD CONSTRAINT [DF_' +@new_table+'_'+a.name+'] DEFAULT '+b.definition+' FOR['+a.name+']; 
' 
from sys.columns a 
join sys.default_constraints b on a.object_id = b.parent_object_id and a.column_id = b.parent_column_id
where a.object_id = object_id(@table_name)  

print @cmd
exec (@cmd)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...