SQL比较两次的字段集合,找出并返回差异,主要用于更新记录事件

Create PROCEDURE [dbo].[SysGetTableFieldsCompare] 


-- Description:    <比较两次的字段集合,找出并返回差异,主要用于更新记录事件>
-- Return 0- 成功, -1- 没有这个表
-- Rev: 1.00
-- =============================================
@FieldsSource Nvarchar(max) ='',
@FieldsTarget Nvarchar(max) ='',
@FieldsChanged nvarchar(max) ='' output 

AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

   if @FieldsSource is null or rtrim(@FieldsSource)='' 
    or @FieldsTarget is null or rtrim(@FieldsTarget)=''
    return -1

--    set @FieldsSource='[ABC]1'
--    set @FieldsTarget='[ABC]2'

    set @FieldsChanged=''
    declare @i int
    declare @FieldsSave nvarchar(max)
    declare @FieldName nvarchar(100)
    declare @FieldValue1 nvarchar(max)
    declare @FieldValue2 nvarchar(max)
    set @i=0
    while  CHARINDEX('[',@FieldsSource)>0 and CHARINDEX(']',@FieldsSource)>0  -- @i<len(@FieldsSource) 
      begin
        if charindex(']',@FieldsSource)>0
        begin  
            set @FieldName=    substring(@FieldsSource,0,charindex(']',@FieldsSource)+1)

            --取字段值
            if charindex(' [',@FieldsSource)>0
            begin
                set @FieldsSource=substring(@FieldsSource,charindex(']',@FieldsSource)+1,len(@FieldsSource))
                set @FieldValue1=rtrim(ltrim(substring(@FieldsSource,0,charindex(' [',@FieldsSource))))
                set @FieldsSource=rtrim(ltrim(substring(@FieldsSource,len(@FieldValue1)+1,len(@FieldsSource))))                
                        
                --取得变更后的字段值

                set @FieldsSave=substring(@FieldsTarget,charindex(@FieldName,@FieldsTarget)+len(@FieldName),len(@FieldsTarget))
                if charindex(' [',@FieldsSave)>0
                    set @FieldValue2=rtrim(ltrim(substring(@FieldsSave,0,charindex(' [',@FieldsSave))))

                if charindex(' [',@FieldsSave)=0
                    set @FieldValue2=rtrim(ltrim(substring(@FieldsSave,0,len(@FieldsSave))))
                
                --开始比较
                if ltrim(rtrim(@FieldValue1))<>rtrim(ltrim(@FieldValue2))
                begin                    
                    set @FieldsChanged=@FieldsChanged+@FieldName+@FieldValue1+'->'+@FieldValue2 + ' '                    
                end 
            end
            else
            begin
                set @FieldValue1=ltrim(substring(@FieldsSource,charindex(']',@FieldsSource)+1,len(@FieldsSource)))
                --取得变更后的字段值

                set @FieldsSave=ltrim(substring(@FieldsTarget,charindex(@FieldName,@FieldsTarget)+len(@FieldName),len(@FieldsTarget)))
                if charindex(' [',@FieldsSave)>0
                    set @FieldValue2=rtrim(ltrim(substring(@FieldsSave,0,charindex(' [',@FieldsSave))))

                if charindex(' [',@FieldsSave)=0
                    set @FieldValue2=rtrim(ltrim(substring(@FieldsSave,0,len(@FieldsSave)+1000)))

                --开始比较
                if ltrim(rtrim(@FieldValue1))<>rtrim(ltrim(@FieldValue2))
                begin                    
                    set @FieldsChanged=@FieldsChanged+@FieldName+@FieldValue1+'->'+@FieldValue2 + ' '                    
                end
                break
            end  
        end
        else
        begin
            break
        end
        set @i=@i+1 
      end    
return 0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值