首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

发布一下自己写的通用触发器获取SQL的语句,还请各位提下意见解决思路

2012-03-21 
发布一下自己写的通用触发器获取SQL的语句,还请各位提下意见update 是在没办法了只好先delete 在 insert各

发布一下自己写的通用触发器获取SQL的语句,还请各位提下意见
update 是在没办法了只好先delete 在 insert
各位有没有更好办法

SQL code
/*触发器获取SQL语句增量传输功能:捕捉修改表的SQL语句使用说明: 1、先新建一表手动写入主键信息或者唯一索引      Create table prmary_key        (  tab_name varchar(255),key_name varchar(255))      --此表仅在建立触发器时使用,建完所有触发器后记得删除      2、建触发器仅需要修改@tab_name变量,即可      3、update语句为2条先删除,后insertCreate By Yujiang*/Declare @cursql     varchar(8000),    @cursqltmp    varchar(8000),    @curkey        Varchar(500),     --主键或唯一索引    @curexecsql    varchar(5000),     --执行SQL    @curcols    varchar(2000),     --所有的列名    @curcolstmp    varchar(2000),     --循环用    @tab_name    varchar(255),    @curtmp        varchar(255)     --循环用    Set @tab_name = 'TJ_ZHXM_HD'        --★需要手动修改Select @cursql = ' if exists(select * from sysobjects where name = '+ char(39) + 'tr_' + @tab_name +'_ZLYJ' + char(39) + ' and type = ''TR'')'               + char(13) + char(10)            + ' drop trigger  tr_'+ @tab_name + '_ZLYJ'Exec(@cursql)--获取主键Select @curkey = key_name from prmary_key where tab_name =  @tab_nameif (@curkey is Null or @curkey = '')Begin    Print @tab_name + '没有主键或唯一索引无法捕捉SQL语句'    ReturnEndSet @curcols = ''Set @cursqltmp = ''if right(@curkey,1) <> ','     Set @curkey = @curkey + ','    declare @col_name varchar(50)    Declare #tmp_cur cursor    for select name from syscolumns where id = object_id(@tab_name)    open #tmp_cur    fetch next from #tmp_cur into @col_name    while @@fetch_status = 0       Begin        Set @curcols = @curcols + @col_name + ','        fetch next from #tmp_cur into @col_name       End    close #tmp_cur    deallocate #tmp_cur--去掉后面的引号Select @curcols = left(@curcols,len(@curcols) - 1)Select @cursql  = ' Create Trigger tr_'+ @tab_name  + '_ZLYJ' + char(13) + char(10)            + ' On ' + @tab_name + char(13) + char(10)        + ' For Insert,Update,Delete' + char(13) + char(10)        + ' AS ' + char(13) + char(10)        + ' Begin' + char(13) + char(10)        + ' Declare @sql varchar(8000), '+ char(13) + char(10)        + '       @sqltmp varchar(1000), '+ char(13) + char(10)        + '      @Nsql Nvarchar(3000),'+ char(13) + char(10)        + '       @key varchar(255),'+ char(13) + char(10)        + '      @tmp_key varchar(50),'+ char(13) + char(10)        + '      @ntmp Nvarchar(50),'+ char(13) + char(10)        + '      @cols varchar(2000),'+ char(13) + char(10)        + '      @coltmp varchar(255),'+ char(13) + char(10)        + '      @inscol varchar(250),'+ char(13) + char(10)        + '      @delcol varchar(250),'+ char(13) + char(10)        + '      @updateflag varchar(1),    --1表示是更新'+ char(13) + char(10)        + '      @updateset varchar(3000),'+ char(13) + char(10)        + '      @ii int,'+ char(13) + char(10)        + '      @ins_cnt int,'+ char(13) + char(10)        + '      @del_cnt int '+ char(13) + char(10)        + ' Select @ii = 0  '+ char(13) + char(10)        + ' Select @ins_cnt = count(1) from inserted'+ char(13) + char(10)        + ' Select @del_cnt = count(1) from deleted'+ char(13) + char(10)        + ' --新增'+ char(13) + char(10)        + ' If (@ins_cnt > 0 And @del_cnt = 0)'+ char(13) + char(10)        + '    Begin'+ char(13) + char(10)        + '       Set @updateflag = ''0'''+ char(13) + char(10)        + '       Goto Ins' + char(13) + char(10)        + '     Return' + char(13) + char(10)                 + '  End'+ char(13) + char(10)         +'  --修改' + char(13) + char(10)         +'  If (@ins_cnt > 0 And @del_cnt > 0)' + char(13) + char(10)        +'     Begin' + char(13) + char(10)        +'       Set @updateflag = ''1'''+ char(13) + char(10)        + '       Goto Del' + char(13) + char(10)        +'    Return    ' + char(13) + char(10)        +'     End' + char(13) + char(10)        +'  --删除' + char(13) + char(10)        +'  If (@ins_cnt = 0 And @del_cnt > 0)' + char(13) + char(10)        +'     Begin' + char(13) + char(10)        +'       Set @updateflag = ''0'''+ char(13) + char(10)        +'       Goto Del' + char(13) + char(10)        +'    Return    ' + char(13) + char(10)        +'     End' + char(13) + char(10) + char(13) + char(10) + char(13) + char(10)        +'    return '         --删除        Select @cursqltmp = 'Del:' + char(13) + char(10)                  + '        Insert into Test(sql)'  + char(13) + char(10)                  + '        Select ''Delete ' + @tab_name + ' where ''+' + char(13) + char(10)            --检索主键            Select @curcolstmp = @curkey            while Charindex(',',@curcolstmp) > 0                  Begin                Select @curtmp = left(@curcolstmp,charindex(',',@curcolstmp) - 1)                --主键肯定不会为空                Select @cursqltmp = @cursqltmp + '            ''CAST(' +  @curtmp + ' AS VARCHAR) = ''+ char(39) + CAST(Rtrim('+ @curtmp + ') AS VARCHAR) + char(39) + And' + char(13) + char(10)                Select @curcolstmp = substring(@curcolstmp,charindex(',',@curcolstmp) + 1 ,len(@curcolstmp))                End            Select @cursqltmp = left(@cursqltmp,len(@cursqltmp) - 7) + ' From deleted'  + char(13) + char(10)            Select @cursqltmp = @cursqltmp + '    if @updateflag = ''1'' ' + char(13) + char(10)                       + '         Goto Ins' + char(13) + char(10)                       + '     else ' + char(13) + char(10)                       + '         Return'+ char(13) + char(10)+ char(13) + char(10)+ char(13) + char(10)        Select @cursql = @cursql + @cursqltmp  + char(13) + char(10)        --插入            Select @cursqltmp = 'Ins: ' + char(13) + char(10)                  + '    Insert into Test(sql) '+ char(13) + char(10)                   + '    Select ''Insert into ' + @tab_name + '(' + @curcols + ')''+' + char(13) + char(10)                  + '    ''values('''            Select @curcolstmp = @curcols + ','            while charindex(',',@curcolstmp) > 0              Begin                 Select @curtmp = left(@curcolstmp,charindex(',',@curcolstmp) - 1)                Select @cursqltmp = @cursqltmp + '        + Isnull(char(39) + Rtrim(CAST(' + @curtmp  + ' as varchar) ) + char(39),''NULL'') + '',''' + char(13) + char(10)                    Select @curcolstmp = substring(@curcolstmp,charindex(',',@curcolstmp) + 1 ,len(@curcolstmp))              End        Select @cursqltmp = left(@cursqltmp,len(@cursqltmp) - 6) + ''')'' from inserted' + char(13) + char(10)        Select @cursql = @cursql + @cursqltmp  + char(13) + char(10)        Set @cursql = @cursql +' End'Exec(@cursql)Print 'ok!...........创建成功!' 



[解决办法]
。。。。。。。。。。。。
[解决办法]
学习
[解决办法]
强 学习
[解决办法]
强,还是不明白这是干啥用的
[解决办法]
不错 有想法
[解决办法]
收藏,再研究

热点排行