Как решить задачу сравнения записей в двух таблицах на разных серверах БД. Если используется MS SQL Server 2008, то можно составить t-sql запрос сразу к двум серверам - это данная СУБД позволяет делать.
В случае если используется более ранняя версия, то я выгружаю таблицу из одной базы и загружаю её во временную таблицу другой. Возможно, есть более просто способ, но я пользуюсь таким.
Для выгрузки используется утилита bcp.exe, которая входит в поставку MS SQL Server:
bcp.exe <полное имя таблицы> out <полный путь к файлу> -T -c -C RAW
bcp.exe basename1.dbo.dvsys_users out C:\temp\table.dat -T -c -C RAW
Далее в той базе, в которую будем импортировать нужно создать временную таблицу, с такими же колонками. Проще всего это сделать, получив скрипт создания таблицы.
Для этого выбираем нужную таблицу в базе (в нашем примере это dvsys_users) и в контекстном меню вызываем следующий пункт
Script table as / Create to / New query editor window
Получаем:
USE [dv1640]
GO
/****** Object: Table [dbo].[dvsys_users] Script Date: 08/05/2009 18:52:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[dvsys_users](
[UserID] [uniqueidentifier] ROWGUIDCOL NOT NULL,
[AccountName] [varchar](64) NOT NULL,
[UserRefID] [uniqueidentifier] NULL,
[SID] [varchar](128) NOT NULL,
[Timestamp] [timestamp] NULL,
CONSTRAINT [pk_dvsys_users] PRIMARY KEY NONCLUSTERED
(
[UserID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
.....
Ключи нам не нужны, оставляем только создание таблицы и колонок:
CREATE TABLE [dbo].[dvsys_TMPusers](
[UserID] [uniqueidentifier],
[AccountName] [varchar](64),
[UserRefID] [uniqueidentifier],
[SID] [varchar](128),
[Timestamp] [timestamp]
)
Все, осталось только загрузить данные
bcp.exe basename2.dbo.dvsys_TMPusers in C:\temp\table.dat -T -c -C RAW
и выполнить запрос, например поиск записей, у которых одинаковый AccountName и разный UserID
SELECT * FROM dvsys_users AS t1
JOIN dvsys_TMPusers AS t2 ON t1.AccountName=t2.AccountName
WHERE t1.UserID<>t2.UserID
Запрос к двум и более серверам можно делать и в SQL2005, и в 2000.
ОтветитьУдалитьКурите SQL Books Online по ключевому слову linked server.
Обращение к "чужой" таблице будет выглядеть как
[имя прилинкованного сервера].[имя БД].dbo.[имя таблицы]
Спасибо, действительно можно через linked servers
ОтветитьУдалитькак вариант
ОтветитьУдалитьнеплохо справляется с этим
redgate sql data compare