среда, 5 августа 2009 г.

Импорт и экспорт таблиц базы данных

Как решить задачу сравнения записей в двух таблицах на разных серверах БД. Если используется 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

3 комментария:

  1. Запрос к двум и более серверам можно делать и в SQL2005, и в 2000.
    Курите SQL Books Online по ключевому слову linked server.
    Обращение к "чужой" таблице будет выглядеть как
    [имя прилинкованного сервера].[имя БД].dbo.[имя таблицы]

    ОтветитьУдалить
  2. Спасибо, действительно можно через linked servers

    ОтветитьУдалить
  3. как вариант
    неплохо справляется с этим
    redgate sql data compare

    ОтветитьУдалить