2016-10-18 5 views
0

Я пишу хранимую процедуру, которая скопирует все содержимое таблицы под названием «CS_Consolidation» в таблицу резервного копирования, называемую «CS_ConsolidationBackup2016», все поля точно такие же, а новые данные каждый день должен быть просто добавлен, после чего исходная таблица должна быть усечена.Скопируйте всю таблицу SQL в другую и обрезайте исходную таблицу

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

CREATE PROCEDURE BackUpData2 
AS 
BEGIN 
SET NOCOUNT ON; 

SELECT * 
INTO [dbo].[CS_ConsolidationBackUp] 
FROM [dbo].[CS_Consolidation] 

TRUNCATE TABLE [dbo].[CS_Consolidation] 
GO 
+2

И проблема в том, что проблема? –

+0

Какие ошибки вы получаете? –

+0

Имейте в виду, что если вы не заблокируете таблицу, вы можете потерять некоторые записи между select и truncate. Я видел это раньше, используя Delete from CS_Consolidation, где Идентификатор в CS_ConsolidationBackUp. Но удаление не делает то, что делает truncate ... –

ответ

1

Если вы хотите создать одну резервную таблицу ежедневно, будет что-то вроде этой работы?

DECLARE @BackupTableName nvarchar(250) 
SELECT @BackupTableName = 'CS_ConsolidationBackUp' + CAST(CONVERT(date, getdate()) as varchar(250)) 
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @BackupTableName) 
BEGIN 
    EXEC('DROP TABLE [' + @BackupTableName + ']') 
END 
EXEC('SELECT * INTO [dbo].[' + @BackupTableName + '] FROM [dbo].[CS_Consolidation]') 
TRUNCATE TABLE [dbo].[CS_Consolidation] 
0

Вы пропали без вести и «конец» заявление перед «идти». Это правильный код:

 
CREATE PROCEDURE BackUpData2 
AS 
BEGIN 
SET NOCOUNT ON; 

SELECT * 
INTO [dbo].[CS_ConsolidationBackUp] 
FROM [dbo].[CS_Consolidation] 

TRUNCATE TABLE [dbo].[CS_Consolidation] 
end 
GO 
1

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

Более простой путь - переименовать в текущую таблицу, а затем создать новую основную таблицу.

EXEC sp_rename 'CS_Consolidation', 'CS_ConsolidationBackUp'; 
GO 
select * 
into CS_Consolidation 
from CS_ConsolidationBackUp 
where 1 = 0; --this ensures no rows but the entire structure is copied. 
Смежные вопросы