powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Рекурсия по таблицам двух копий одной БД
4 сообщений из 4, страница 1 из 1
Рекурсия по таблицам двух копий одной БД
    #39817602
shanton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть две восстановленные копии одной БД, с небольшое разницей во времени. Стоит задача, найти таблицы в которых данные не одинаковые, по всем полям и строкам. Понимаю, что нужно делать рекурсию по всем таблицам и сравнивать каждую пару по всем полям. Может кто встречал подобное решение? Буду благодарен!
...
Рейтинг: 0 / 0
Рекурсия по таблицам двух копий одной БД
    #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
Рекурсия по таблицам двух копий одной БД
    #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
Рекурсия по таблицам двух копий одной БД
    #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
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Рекурсия по таблицам двух копий одной БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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