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
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