Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Синхронизация баз  [new]
alexis glinski
Member

Откуда: Minsk
Сообщений: 408
Есть 2 базы с разной структурой данных в которых хранится схожая информация (одня база 1С ;) ), требуется односторонняя синхронизация (т.е. писать только в одну базу INSERT или UPDATE, DELETE не нужен) ... Если использовать DTS, то для INSERT всё понятно, но как сравнить таблицы чтобы проUPDATEить без изменения структуры (не добавляя новых полей) ???
18 дек 03, 13:45    [465296]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
Можно попробовать так:

DECLARE @@src_db nvarchar(32), @@dest_db nvarchar(32)
DECLARE @@table_name nvarchar(256), @@primary_key nvarchar(64)
DECLARE @@sql_text nvarchar(2048)
DECLARE @@column nvarchar(128)

SET @@src_db = 'Decanat6';
SET @@dest_db = 'Decanat6_Work';

DECLARE tables CURSOR FOR SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_TYPE = 'BASE TABLE' AND
TABLE_NAME NOT LIKE 'conflict%' ORDER BY TABLE_NAME
OPEN tables
FETCH NEXT FROM tables INTO @@table_name
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @@primary_key = KC.COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE KC
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC ON TC.CONSTRAINT_NAME = KC.CONSTRAINT_NAME
WHERE TC.CONSTRAINT_TYPE = 'PRIMARY KEY' AND KC.TABLE_NAME = @@table_name


SET @@sql_text = N' SELECT A.* FROM ' + @@src_db + N'.dbo.' + @@table_name + N' INTO #different A WHERE ' +
N'EXISTS (SELECT ' + @@primary_key + N' FROM ' +
@@dest_db + N'.dbo.' + @@table_name + ' B WHERE A.' + @@primary_key + ' = B.' +
@@primary_key + N' AND BINARY_CHECKSUM(*) <> (SELECT BINARY_CHECKSUM(*) FROM ' +
@@src_db + N'.dbo.' + @@table_name + N' WHERE ' + @@primary_key + N' = A.' + @@primary_key + N'))'

DECLARE columns_cursor CURSOR FOR
SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name <> @@primary_key AND column_name <> 'rowguid' AND table_name = @@table_name

SET @@sql_text = N'UPDATE A SET ';

OPEN columns_cursor
FETCH NEXT FROM columns_cursor INTO @@column
WHILE @@FETCH_STATUS = 0
BEGIN
SET @@sql_text = @@sql_text + @@column + N' = B.' + @@column + N',';
FETCH NEXT FROM columns_cursor INTO @@column
END
SET @@sql_text = LEFT(@@sql_text, LEN(@@sql_text) - 1);
SET @@sql_text = @@sql_text + ' FROM ' + @@dest_db + N'.dbo.' + @@table_name + N' A,' +
@@src_db + N'.dbo.' + @@table_name + N' B WHERE A.' + @@primary_key +
N' = B.'+@@primary_key;
PRINT @@sql_text
CLOSE columns_cursor
DEALLOCATE columns_cursor

EXEC sp_executesql @@sql_text
FETCH NEXT FROM tables INTO @@table_name
END
CLOSE tables
DEALLOCATE tables
18 дек 03, 14:17    [465378]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз  [new]
alexis glinski
Member

Откуда: Minsk
Сообщений: 408
забыл сказать что БД на разных серверах (в локальной сети) ...
19 дек 03, 13:42    [467088]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизация баз  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
ну дак добавьте linked сервер и указывайте полный путь к базе - [сервер].[бд]
19 дек 03, 14:40    [467277]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить