Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Рекурсия по таблицам двух копий одной БД  [new]
shanton
Member

Откуда: Украина г. Хмельницкий
Сообщений: 628
Есть две восстановленные копии одной БД, с небольшое разницей во времени. Стоит задача, найти таблицы в которых данные не одинаковые, по всем полям и строкам. Понимаю, что нужно делать рекурсию по всем таблицам и сравнивать каждую пару по всем полям. Может кто встречал подобное решение? Буду благодарен!
24 май 19, 11:05    [21892907]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по таблицам двух копий одной БД  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
use db1;

declare @result table (table_name sysname);
declare @sql nvarchar(max);

select
 @sql = t.x.value('.', 'nvarchar(max)')
from
 (
  select
   N'select ''' + b.table_name + N''' from (select checksum_agg(checksum(*)) from ' + b.table_name + N'except select checksum_agg(checksum(*)) from db2.' + b.table_name + N') t(cs); '
  from
   sys.tables a cross apply
   (select quotename(schema_name(schema_id)) + N'.' + quotename(name)) b(table_name)
  for xml path(''), type
 ) t(x);

insert into @result
 exec sp_executesql @sql;

select * from @result;
24 май 19, 11:34    [21892953]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по таблицам двух копий одной БД  [new]
shanton
Member

Откуда: Украина г. Хмельницкий
Сообщений: 628
При выполнении получаю ошибку:
Msg 8116, Level 16, State 4, Line 1
Argument data type ntext is invalid for argument 4 of checksum function.

понимаю, что ошибка из-за типа данных ntext. Как быть в данном случаи.
25 май 19, 02:01    [21893610]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия по таблицам двух копий одной БД  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
use db1;

declare @result table (table_name sysname);
declare @sql nvarchar(max);

select
 @sql = t.x.value('.', 'nvarchar(max)')
from
 (
  select
   N'select ''' + b.table_name + N''' from (select checksum_agg(checksum(' + f.columns_list + N')) from ' + b.table_name + N'except select checksum_agg(checksum(' + f.columns_list + N')) from db2.' + b.table_name + N') t(cs); '
  from
   sys.tables a cross apply
   (select quotename(schema_name(schema_id)) + N'.' + quotename(name)) b(table_name) cross apply
   (
    select
     ', ' +
     case type_name(c.system_type_id)
      when N'text' then N'cast(' + d.name + N' as varchar(max))'
      when N'ntext' then N'cast(' + d.name + N' as nvarchar(max))'
      when N'image' then N'cast(' + d.name + N' as varbinary(max))'
      when N'xml' then N'cast(' + d.name + N' as varbinary(max))'
      when N'sql_variant' then N'cast(' + d.name + N' as varbinary(max))'
      else d.name
     end
    from
     sys.columns c cross apply
     (select quotename(c.name)) d(name)
    where
     c.object_id = a.object_id
    for xml path(''), type
   ) e(x) cross apply
   (select stuff(e.x.value('.', 'nvarchar(max)'), 1, 2, '')) f(columns_list)
  for xml path(''), type
 ) t(x);

insert into @result
 exec sp_executesql @sql;

select * from @result;
25 май 19, 11:50    [21893709]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить