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

Откуда: Саратов
Сообщений: 467
Стоит задача репликации данных из БД-источника SourceDB в целевую БД TargetDB.
Осуществляется она следующим образом
	declare @now datetime = GETDATE();
	CREATE TABLE #SOBLIds (IdNew int, IdOld int);

	merge into  TargetDB.dbo.SObjectOBudgetLink_tbl tso
	using  (select sll.ID, so.IDSObject, sll.OBudgetID as IDOBudget, sll.LType, sll.StatusID, ob.IDGoodWork_int as IDOBudget_int, so.IDSObject_int 
			from SourcetDB.slices.SObjectOBudgetLinks sll
			join SourcetDB.dbo.SObject_tbl as so on so.IDSObject_int = sll.SObjectID
			join SourcetDB.dbo.Contract_GoodWork_tbl as ob on sll.OBudgetID = ob.IDGoodWork) iso				
		on (tso.IDOBudget_int = iso.IDOBudget_int and tso.IDSObject_int = iso.IDSObject_int)
	when matched then
		update set LType = tso.LType | iso.Ltype, IdStatus = iso.StatusID
	when not matched by target then
		insert (IDSObject, IDOBudget, LType, JoinType, [Date], IdStatus, IDOBudget_int, IDSObject_int) 
			values (iso.IDSObject, iso.IDOBudget, iso.LType, 0, @now, iso.StatusID, iso.IDOBudget_int, iso.IDSObject_int ) 
	output  inserted.IDOBudgetLink, iso.ID into #SOBLIds;	

Все не-NULL поля в предложении insert перечислены(кроме автоинкрементного).
Более того, целевая БД является пустой, то есть должна отрабатывать только ветка when not matched.
Однако при выполнении команды все время возникает ошибка
Попытка указания значения NULL для столбца, который не может содержать значение NULL.

Причем если не использовать merge, то все работает
+
	insert TargetDB.dbo.SObjectOBudgetLink_tbl (IDSObject, IDOBudget, LType, JoinType, [Date], IdStatus, IDOBudget_int, IDSObject_int) 
	output  inserted.IDOBudgetLink, inserted.IDOBudgetLink into #SOBLIds
	select so.IDSObject, sll.OBudgetID as IDOBudget, sll.LType, 0, @now, sll.StatusID, ob.IDGoodWork_int as IDOBudget_int, so.IDSObject_int 
			from SourcetDB.slices.SObjectOBudgetLinks sll
			join SourcetDB.dbo.SObject_tbl as so on so.IDSObject_int = sll.SObjectID
			join SourcetDB.dbo.Contract_GoodWork_tbl as ob on sll.OBudgetID = ob.IDGoodWork

Т.е. вставляемый набор не имеет значений null.
Почему merge вызывает ошибку?
30 апр 14, 17:55    [15960067]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц с помощью Merge  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
Шамиль Фаридович,

http://support.microsoft.com/kb/2671078/en-us ваш случай?
30 апр 14, 18:48    [15960306]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц с помощью Merge  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 467
По симптомам очень похоже. Спасибо!
30 апр 14, 19:37    [15960469]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц с помощью Merge  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 467
Только вот не пойму, какой из 4 предложенных файлов (вложение) нужно скачивать?

К сообщению приложен файл. Размер - 11Kb
30 апр 14, 19:41    [15960483]     Ответить | Цитировать Сообщить модератору
 Re: Репликация таблиц с помощью Merge  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 467
Попалась статья на эту тему
http://blogs.msdn.com/b/psssql/archive/2009/10/23/should-i-have-a-snac-with-my-cumulative-update.aspx
Суть примерно в том, что "главный" пакет, коим является
SQLServer2008R2_SP2_CU10_2908087_10_50_4297_x64
содержит в себе все необходимые обновления для сервера, в том числе обновление SQL Native Client (SNAC)
2008R2_SP2_SNAC_CU10_2908087_10_50_4297_x64.
Но это обновление необходимо запустить на всех клиентских машинах, на которых был установлен SNAC.

Два других обновления относятся к Master Data Services и Reporting Services Sharepoint Add-in, которые мной не используются.
Вот кстати еще статья по правилам присвоения имен пакетам обновлений:
http://support.microsoft.com/kb/822499
1 май 14, 22:38    [15962850]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить