根据日期列

时间:2019-04-11 15:48:11

标签: sql-server

我正在尝试设置一个流程,将每日数据从生产暂存表导出到测试暂存表。我想将此导出每天从产品暂存到测试。这些登台表包含每日数据。因此,有什么方法可以截断测试登台表,然后再将生产中的数据从生产中加载到数据库中所有表的每日测试中?

我尝试使用链接服务器。但是,我无法获得工作。

1 个答案:

答案 0 :(得分:0)

我在工作中写了这个存储过程来处理类似的情况,这可能对您有帮助:

CREATE Proc DumpFromPRO(@prodServ sysname, @prodDBname sysname = null) as
declare @sql nvarchar(MAX)
declare @XD table (ts sysname,tn sysname)

set nocount on

if not exists (select 1 from sys.servers where is_linked=1 and name=@prodServ)
begin
    raiserror ('Linked server not found.',19,1) with log
    set noexec on
end
if @prodDBname is null
    select top 1 @prodDBname = TABLE_CATALOG from INFORMATION_SCHEMA.TABLES

set @sql = ''
select @sql +=
          'alter table ' + quotename(TABLE_CATALOG) + '.' + TABLE_SCHEMA + '.' + TABLE_NAME + ' nocheck constraint all; '
        + 'alter table ' + quotename(TABLE_CATALOG) + '.' + TABLE_SCHEMA + '.' + TABLE_NAME + ' disable trigger all; '
from INFORMATION_SCHEMA.TABLES
where TABLE_TYPE = 'BASE TABLE'
exec (@sql)

set @sql = ''
select @sql +=
          'delete ' + quotename(TABLE_CATALOG) + '.' + TABLE_SCHEMA + '.' + TABLE_NAME + ' with (TABLOCK); '
        + 'alter index all on ' + quotename(TABLE_CATALOG) + '.' + TABLE_SCHEMA + '.' + TABLE_NAME + ' rebuild; '
from INFORMATION_SCHEMA.TABLES
where TABLE_TYPE = 'BASE TABLE'
exec (@sql)

select @sql =
     'select schema_name(t.schema_id) as ts,t.name as tn from '+quotename(@prodServ)+'.'+quotename(@prodDBname)
    +'.sys.tables t join '+quotename(@prodServ)+'.'+quotename(@prodDBname)
    +'.sys.partitions p on (t.object_id=p.object_id and p.index_id in (0,1)) '
    +'group by schema_name(schema_id),t.name having sum(p.rows)>0'

insert @XD exec (@sql)

set @sql = ''
select @sql +=
    case
        when exists (
            select 1 from sys.columns
            where [object_id] = object_id(t.TABLE_SCHEMA+'.'+t.TABLE_NAME)
                and is_identity = 1)
        then  'set identity_insert ' + quotename(TABLE_CATALOG) + '.' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME + ' on; '
        else  ''
    end
    + 'insert ' + quotename(TABLE_CATALOG) + '.' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME + ' with (TABLOCK) ('
    + stuff((select ', ' + COLUMN_NAME
              from INFORMATION_SCHEMA.COLUMNS
              where TABLE_SCHEMA = t.TABLE_SCHEMA and TABLE_NAME = t.TABLE_NAME
                and DATA_TYPE not in ('timestamp','rowversion')
              for xml path('')), 1, 2, '')
    + ') select ' 
    + stuff((select ', ' + COLUMN_NAME
              from INFORMATION_SCHEMA.COLUMNS
              where TABLE_SCHEMA = t.TABLE_SCHEMA and TABLE_NAME = t.TABLE_NAME
                and DATA_TYPE not in ('timestamp','rowversion')
              for xml path('')), 1, 2, '')
    + ' from ' + quotename(@prodServ) + '.' + quotename(@prodDBname) + '.' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME + '; ' +
    case
        when exists (
            select 1 from sys.columns
            where [object_id] = object_id(t.TABLE_SCHEMA+'.'+t.TABLE_NAME)
                and is_identity = 1)
        then  'set identity_insert ' + quotename(TABLE_CATALOG) + '.' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME + ' off; '
        else  ''
    end
from INFORMATION_SCHEMA.TABLES t
join @XD x on (t.TABLE_SCHEMA=x.ts and t.TABLE_NAME=x.tn)
where TABLE_TYPE = 'BASE TABLE'
exec (@sql)

set @sql = ''
select @sql +=
      'alter table ' + quotename(TABLE_CATALOG) + '.' + TABLE_SCHEMA + '.' + TABLE_NAME + ' check constraint all; '
    + 'alter table ' + quotename(TABLE_CATALOG) + '.' + TABLE_SCHEMA + '.' + TABLE_NAME + ' enable trigger all; '
from INFORMATION_SCHEMA.TABLES
where TABLE_TYPE = 'BASE TABLE'
exec (@sql)

DBCC CheckConstraints with ALL_CONSTRAINTS
set noexec off