=Explanation of SQL=
This SQL can be used to to find out all the differences between two database rows. These may be
This query is helpful to compare a backup with the current table, or to compare two rows in the same table.
=Risk of Data Corruption if Run Improperly=
None. This is a selection query and no data is modified in the running of it.
=Notes=
For example:
Convert( Decimal(18,4), Convert( Float, Value1 ) ) is fine, but
Convert( Decimal(18,4), Value1 ) will only give you the mantissa and not the correct value.
* Only values that changed are listed. Values that remained the same are not shown.
=SQL=
– this query compares rows in two tables and lists all the rows that are different.
– Set these values
declare @ID1 int = (select ID from Account where CompanyName like 'Grand Image Inc%' and IsClient = 1);
declare @Table1 varchar(100) = '[2016-03-09 AccountUserField]';
declare @ID2 int = @ID1;
declare @Table2 varchar(100) = '[AccountUserField]';
– Now run – the rest is good!
declare @xml1 xml;
declare @xml2 xml;
declare @t table (
ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
ColumnName varchar(100),
Value1 varchar(100),
Value2 varchar(100)
);
declare @q nvarchar(2048) =
' set @xmloutput = (
select TOP 1 * from '+@Table1+' as [TABLE] where ID = '+convert(varchar(10), @ID1)+' Order by ID for XML AUTO, ELEMENTS
);'
EXECUTE sp_executeSql @q, N'@xmloutput XML OUTPUT', @xmloutput=@xml1 OUTPUT;
SET @q =
' set @xmloutput = (
select TOP 1 * from '+@Table2+' as [TABLE] where ID = '+convert(varchar(10), @ID2)+' Order by ID for XML AUTO, ELEMENTS
);'
EXECUTE sp_executeSql @q, N'@xmloutput XML OUTPUT', @xmloutput=@xml2 OUTPUT;
– now join the two XMLs using the ColumName and exclude any that are not different
with
XML1 as
(
select T.N.value('local-name(.)', 'nvarchar(100)') as NodeName,
T.N.value('.', 'nvarchar(100)') as Value
from @xml1.nodes('/TABLE/*') as T(N)
),
XML2 as
(
select T.N.value('local-name(.)', 'nvarchar(100)') as NodeName,
T.N.value('.', 'nvarchar(100)') as Value
from @xml2.nodes('/TABLE/*') as T(N)
)
insert into @t (ColumnName, Value1, Value2)
select coalesce(XML1.NodeName, XML2.NodeName) as NodeName,
XML1.Value as Value1,
XML2.Value as Value2
from XML1
full outer join XML2
on XML1.NodeName = XML2.NodeName
where coalesce(XML1.Value, '') coalesce(XML2.Value, '')
-- and XML1.NodeName not in ('StoreID', 'ModifiedByUser', 'ModifiedByComputer', 'SeqID')
;
– Now show the changes
select T.ColumnName, T.Value1, T.Value2
from @t T
=Version Information=
=Related SQLs=