Сравнение данных SQL - некоторые таблицы отсутствуют

Когда вы выполняете сравнение данных с помощью SQL Server Data Tools через VS 2013 pro, у меня есть сценарий, когда некоторые таблицы, кажется, пропущены.

Я имею в виду, что есть данные в TableA на исходном сервере, но нет данных в эквивалентной таблице на целевом сервере.

Однако в окне результатов не отображается строка для TableA.

Также, если я попытаюсь отфильтровать результаты на следующем шаге до нажатия "Готово", TableA не будет отображаться как опция для фильтрации. Это почти так, как если бы таблица не существовала на целевом сервере. Я проверил, что есть:

  • Подключение через SSMS и просмотр списка таблиц
  • Запуск SELECT * FROM information_schema.tables

В обоих случаях я вижу, что таблица указана.

Кто-нибудь еще видел это? Что мне не хватает?

Ответ 1

Данные можно сравнивать, только если вы знаете, какие записи из таблиц нужно сравнивать. Comparer использует PK, чтобы знать, какие записи сравнивать. Если в вашей таблице нет PK (или хотя бы уникального индекса), он может отсутствовать в списке таблиц.

Вы можете решить эту проблему, создав ПК самостоятельно (только для сравнения)

EDIT

  1. Сотруднику недавно пришлось нелегко из-за того, что кто-то явно исключил некоторые таблицы из проекта сравнения и отправил его в git. Так что проверьте, если это не новый проект.

  2. Недавно мне было поручено сравнить таблицы без PK, и я обнаружил, что HASHBYTES является новым другом. Кроме того, в таблицах нет уникальных строк, и для их решения я использовал ROW_NUMBER с PARTITION, см. ниже фрагмент.

    SELECT Row_number() 
             OVER ( 
               partition BY [hashid] 
               ORDER BY [hashid]) AS RowNumber, 
           * 
    INTO   [dbo].[mytable_temp] 
    FROM   (SELECT Hashbytes('SHA2_512', (SELECT x.* 
                                          FOR xml raw)) AS [HASHID], 
                   * 
            FROM   [dbo].[mytable] AS x) AS y 

    go 

    ALTER TABLE [dbo].[mytable_temp] 
      ALTER COLUMN [hashid] VARBINARY(900) NOT NULL 

    ALTER TABLE [dbo].[mytable_temp] 
      ALTER COLUMN [rownumber] BIGINT NOT NULL 

    go 

    ALTER TABLE [dbo].[mytable_temp] 
      ADD CONSTRAINT pk_id PRIMARY KEY ([hashid], [rownumber]) 

    go 

Таким образом, я могу создать PK на основе хеша, рассчитанного для всего содержимого строки.

Obs :. Заметьте, я сравниваю MyTable_TEMP, а не MyTable. таким образом, я могу оставить это без внимания.