Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Рекурсия по таблицам двух копий одной БД / 4 сообщений из 4, страница 1 из 1
24.05.2019, 11:05
    #39817602
shanton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсия по таблицам двух копий одной БД
Есть две восстановленные копии одной БД, с небольшое разницей во времени. Стоит задача, найти таблицы в которых данные не одинаковые, по всем полям и строкам. Понимаю, что нужно делать рекурсию по всем таблицам и сравнивать каждую пару по всем полям. Может кто встречал подобное решение? Буду благодарен!
...
Рейтинг: 0 / 0
24.05.2019, 11:34
    #39817637
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсия по таблицам двух копий одной БД
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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;
...
Рейтинг: 0 / 0
25.05.2019, 02:01
    #39818116
shanton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсия по таблицам двух копий одной БД
При выполнении получаю ошибку:
Код: sql
1.
2.
Msg 8116, Level 16, State 4, Line 1
Argument data type ntext is invalid for argument 4 of checksum function.


понимаю, что ошибка из-за типа данных ntext. Как быть в данном случаи.
...
Рейтинг: 0 / 0
25.05.2019, 11:50
    #39818154
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсия по таблицам двух копий одной БД
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
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;
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Рекурсия по таблицам двух копий одной БД / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]