SQL对某张表建立触发器,然后根据编码与名称,跨服务器动态建表与生成数据

SQL对某张表建立触发器,然后根据编码与名称,跨服务器动态建表(判断是否存在,存在即更新数据,否则先建表),然后生成数据。

注意:

1. 动态语句执行时最好指定服务器 exec LinkName.dbn.dbo.sp_executesql @sql;

    当建表时使用的exec('use linkdbn create table......) at LinkName;  紧随其后的CRUD直接用exec sp_executesql 'insert......'时会报错:

    消息 3970,级别 16,状态 2,第 1 行
    此操作与此事务上的另一个挂起操作冲突。此操作失败。

    exec LinkName.dbn.dbo.sp_executesql 'insert......‘则不会报错。

具体代码如下:

[code=sql]
drop TRIGGER syncFor_Update;
go

CREATE TRIGGER syncFor_Update
on 本地数据库表名
after update,insert
as
begin
 declare @mainTb nvarchar(100);
 declare @listTb nvarchar(100);
 declare @rowsCount nvarchar(100);
 declare @rowsCounts nvarchar(100);
 declare @sql nvarchar(2550);
 declare @sql1 nvarchar(2550);
 declare @sql2 nvarchar(2550);
 declare @name nvarchar(10);
 declare @code nvarchar(10);
 set @mainTb = 'mainTable'+'唯一标识';
 set @listTb = 'listTable'+'唯一标识';
 set @rowsCount = '-1';
 set @rowsCounts = '-1';
 
 ---- 表存在即更新,否则新增(表头+表体)
 set @sql='SELECT @rowsCounts = count(1) FROM dbo.SysObjects WHERE ID = object_id(@mainTb) AND OBJECTPROPERTY(ID, ''IsTable'') = 1';
 exec [LinkName].[DB].DBO.sp_executesql @sql,N'@rowsCounts int out,@mainTb nvarchar(100)',@rowsCounts out,@mainTb;
 select @rowsCounts;
 print (@rowsCounts);
 if @rowsCounts != 0
  begin
   set @sql='select @rowsCount = count(1) from '+@listTb+' where field0004 = @code;';
   exec [LinkName].[DB].DBO.sp_executesql @sql,N'@rowsCount int out,@code nvarchar(10)',@rowsCount out,@code;
   select @rowsCount;
   print (@rowsCount);
   if @rowsCount != 0
    begin
     -- 表体:更新
     set @sql = N'update '+@listTb+' set field0008 = @name where field0004 = @code;'
     exec [LinkName].[DB].DBO.sp_executesql @sql,N'@name nvarchar(100),@code nvarchar(100)',@name,@code;
    end
   else
    begin
     -- 表体:新增
     set @sql = N'insert into '+@listTb+' (ID,field0004,field0005,field0006,field0007,field0008,field0009)
        values (1,@code,3,4,5,@name,7);';
     exec [LinkName].[DB].DBO.sp_executesql @sql,
        N'@name nvarchar(100),@code nvarchar(100)',
        @name,@code;
    end
  end
 else
  BEGIN
   -- 建表-- 建表
   exec ('use 远程数据库名 CREATE TABLE '+@mainTB+'(
      ID numeric(19, 0) NOT NULL,
      field0001 nvarchar(255) NULL,
      field0002 nvarchar(255) NULL,
      field0003 nvarchar(255) NULL,
     PRIMARY KEY CLUSTERED
     (
      ID ASC
     )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,
     ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
     ) ON [PRIMARY];') at LinkName;
   
   exec ('use 远程数据库名 CREATE TABLE '+@listTB+'(
      ID numeric(19, 0) NOT NULL,
      field0004 nvarchar(255) NULL,
      field0005 nvarchar(255) NULL,
      field0006 nvarchar(255) NULL,
      field0007 nvarchar(255) NULL,
      field0008 nvarchar(255) NULL,
      field0009 nvarchar(255) NULL,
     PRIMARY KEY CLUSTERED
     (
      ID ASC
     )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,
     ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
     ) ON [PRIMARY];') at LinkName;
   -- 表头:新增
   set @sql1 = N'insert into '+@mainTb+' (id,field0001,field0002,field0003)
      select 1,2,3
       where not exists (select 1
            from '+@mainTb+');';
   exec [LinkName].[DB].DBO.sp_executesql @sql1;
   
   -- 表体:新增
   set @sql = N'insert into '+@listTb+' (ID,field0004,field0005,field0006,field0007,field0008,field0009)
      values (1,@code,3,4,5,@name,7);';
   exec [LinkName].[DB].DBO.sp_executesql @sql,
      N'@name nvarchar(100),@code nvarchar(100)',
      @name,@code;
  END
end

[/code]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值