简体   繁体   English

复制数据库中的所有表并添加新数据,而不影响旧数据SQL

[英]Copy all tables in database and add new data without affecting the old data SQL

Can anyone help me with a stored procedure that would allow all the tables in a database to be copied and the original tables must be truncated at the end, and when the procedure runs everyday all new data must be copied from the original table to the backup tables without affecting the existing data. 任何人都可以通过存储过程为我提供帮助,该存储过程将允许复制数据库中的所有表,并且原始表必须在末尾被截断,并且该过程每天运行时,必须将所有新数据从原始表复制到备份中表而不影响现有数据。

This is what I've done 这就是我所做的

CREATE PROCEDURE ZS_Backup
AS
BEGIN

SELECT * INTO
 [dbo].[CS_ArrivalsBackUp], 
 [dbo].[CS_awbBackUp],
 [dbo].[CS_awb_arrivalsBackUp],
 [dbo].[CS_awb_dlvBackUp],
 [dbo].[CS_awb_iataBackUp],
 [dbo].[CS_awb_iata_arrivalsBackUp],
 [dbo].[CS_ConsolidationBackUp],
 [dbo].[CS_part_agents],
 [dbo].[CS_part_consignee],
 [dbo].[Evo_Customers],
 [dbo].[Evo_Products],
 [dbo].[int_log_arrivals],
 [dbo].[int_log_deliveries],
 [dbo].[integration_logs],
 [dbo].[period],
 [dbo].[public_holidays],
 [dbo].[rates],
 [dbo].[temp_Rates]

FROM [dbo].[CS_Arrivals],
       [dbo].[CS_awb],
      [dbo].[CS_awb_arrivals],
      [dbo].[CS_awb_dlv],
      [dbo].[CS_awb_iata],
      [dbo].[CS_awb_iata_arrivals],
      [dbo].[CS_Consolidation],
      [dbo].[CS_part_agents],
      [dbo].[CS_part_consignee],
      [dbo].[Evo_Customers],
      [dbo].[Evo_Products],
      [dbo].[int_log_arrivals],
      [dbo].[int_log_deliveries],
      [dbo].[integration_logs],
      [dbo].[period],
      [dbo].[public_holidays],
      [dbo].[rates],
      [dbo].[temp_Rates]

TRUNCATE TABLE [dbo].[CS_Arrivals],
           [dbo].[CS_awb],
           [dbo].[CS_awb_arrivals],
           [dbo].[CS_awb_dlv],
           [dbo].[CS_awb_iata],
           [dbo].[CS_awb_iata_arrivals],
           [dbo].[CS_Consolidation],
           [dbo].[CS_part_agents],
           [dbo].[CS_part_consignee],
           [dbo].[Evo_Customers],
           [dbo].[Evo_Products],
           [dbo].[int_log_arrivals],
           [dbo].[int_log_deliveries],
           [dbo].[integration_logs],
           [dbo].[period],
           [dbo].[public_holidays],
           [dbo].[rates],
           [dbo].[temp_Rates]

           END
           GO

Here you go, 干得好,

be careful where you run this. 小心在哪里运行。 For your safety I have commented out the bit that actually does the copy and truncate but instead I have set it so it would show you what would be executed: 为了您的安全起见,我已注释掉实际执行复制和截断的部分,但我对其进行了设置,以便它将向您显示将执行的操作:

DECLARE @table_name nvarchar(1000)
DECLARE @SQL nvarchar(1000)

DECLARE CUR CURSOR 
FOR 
SELECT name 
FROM sys.tables
WHERE type = 'U'
and name IN ('CS_ArrivalsBackUp', 
'CS_awbBackUp',
'CS_awb_arrivalsBackUp',
'CS_awb_dlvBackUp',
'CS_awb_iataBackUp',
'CS_awb_iata_arrivalsBackUp',
'CS_ConsolidationBackUp',
'CS_part_agents',
'CS_part_consignee',
'Evo_Customers',
'Evo_Products',
'int_log_arrivals',
'int_log_deliveries',
'integration_logs',
'period',
'public_holidays',
'rates',
'temp_Rates')
ORDER BY NAME

OPEN CUR

FETCH NEXT FROM CUR
INTO @table_name

WHILE @@FETCH_STATUS = 0  
BEGIN  

PRINT 'SELECT * INTO TMP_' + @table_name + ' FROM ' + @table_name
PRINT 'TRUNCATE TABLE ' + @table_name 

--SET @SQL = 'SELECT * INTO TMP_' + @table_name + ' FROM ' + @table_name
--EXEC (@SQL)

--SET @SQL = 'TRUNCATE TABLE ' + @table_name 
--EXEC (@SQL)

FETCH NEXT FROM CUR INTO @table_name  

END
CLOSE CUR
DEALLOCATE CUR

Okay only a slight change needed. 好吧,只需要稍作改动即可。 Once your temp tables are created (above in the first run); 创建临时表后(在第一次运行中); then for future runs you need: 然后,为了将来运行,您需要:

DECLARE @table_name nvarchar(1000)
DECLARE @SQL nvarchar(1000)

DECLARE CUR CURSOR 
FOR 
SELECT name 
FROM sys.tables
WHERE type = 'U'
and name IN ('CS_ArrivalsBackUp', 
'CS_awbBackUp',
'CS_awb_arrivalsBackUp',
'CS_awb_dlvBackUp',
'CS_awb_iataBackUp',
'CS_awb_iata_arrivalsBackUp',
'CS_ConsolidationBackUp',
'CS_part_agents',
'CS_part_consignee',
'Evo_Customers',
'Evo_Products',
'int_log_arrivals',
'int_log_deliveries',
'integration_logs',
'period',
'public_holidays',
'rates',
'temp_Rates')
ORDER BY NAME

OPEN CUR

FETCH NEXT FROM CUR
INTO @table_name

WHILE @@FETCH_STATUS = 0  
BEGIN  

PRINT 'INSERT INTO TMP_' + @table_name + ' SELECT * FROM_' + @table_name
PRINT 'TRUNCATE TABLE ' + @table_name 

--SET @SQL = 'INSERT INTO TMP_' + @table_name + ' SELECT * FROM_' + @table_name
--EXEC (@SQL)

--SET @SQL = 'TRUNCATE TABLE ' + @table_name 
--EXEC (@SQL)

FETCH NEXT FROM CUR INTO @table_name  

END
CLOSE CUR
DEALLOCATE CUR

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM