【发布时间】:2015-04-02 13:31:03
【问题描述】:
我在 SQL Server 上遇到了这个奇怪的错误。而且我在旧帖子中找不到解决方案。
我有这个程序:
create proc _upJM_SyncAll_test
as
begin
DECLARE @SQLString nvarchar(max)
set @SQLString = N'
DELETE FROM OPENQUERY([LOCAL_MYSQL],''SELECT acSubject FROM _utjm_setitemprices'') where acSubject not in (select acSubject from _uvJM_SetSubj)
DELETE FROM OPENQUERY([LOCAL_MYSQL],''SELECT acSubject FROM _utjm_setsubj'') where acSubject not in (select acSubject from _uvJM_SetSubj)
update a
set acName2 = b.acName2,
acName3 = b.acName3,
acAddress = b.acAddress,
acPost = b.acPost,
acPostName = b.acPostName,
acCountry = b.acCountry,
acVATCodePrefix = b.acVATCodePrefix,
acCode = b.acCode,
anDaysForPayment = b.anDaysForPayment
from OPENQUERY([LOCAL_MYSQL],''SELECT * FROM _utjm_setsubj'') a join _uvJM_SetSubj b on (a.acSubject = b.acSubject)
where 1=1
and ( isnull(a.acName2,'''') <> isnull(b.acName2,'''') OR
isnull(a.acName3,'''') <> isnull(b.acName3,'''') OR
isnull(a.acAddress,'''') <> isnull(b.acAddress,'''') OR
isnull(a.acPost,'''') <> isnull(b.acPost,'''') OR
isnull(a.acPostName,'''') <> isnull(b.acPostName,'''') OR
isnull(a.acCountry,'''') <> isnull(b.acCountry,'''') OR
isnull(a.acVATCodePrefix,'''') <> isnull(b.acVATCodePrefix,'''') OR
isnull(a.acCode,'''') <> isnull(b.acCode,'''') OR
isnull(a.anDaysForPayment,'''') <> isnull(b.anDaysForPayment,'''')
)
insert into OPENQUERY([LOCAL_MYSQL],''SELECT * FROM _utjm_setsubj'') (acSubject, acName2, acName3, acAddress, acPost, acPostName, acCountry, acVATCodePrefix, acCode, anDaysForPayment)
select b.acSubject, b.acName2, b.acName3, b.acAddress, b.acPost, b.acPostName, b.acCountry, b.acVATCodePrefix, b.acCode, b.anDaysForPayment
from OPENQUERY([LOCAL_MYSQL],''SELECT * FROM _utjm_setsubj'') a right join _uvJM_SetSubj b on (a.acSubject = b.acSubject)
where a.acSubject is null '
EXECUTE sp_executesql @SQLString;
end
当我像这样在管理工作室中运行程序时:
exec dbo._upJM_SyncAll_test
一切正常。我没有收到任何错误,同步工作正常。
但是当我像这样在触发器中执行时:
create trigger _utrJM_SetSubj on tHE_SetSubj after insert, update, delete
as
begin
exec dbo._upJM_SyncAll_test
end
我收到此错误:
消息 8501,级别 16,状态 3,过程 _upJM_SyncAll_test,第 54 行
服务器“服务器”上的 MSDTC 不可用。
Procedure _upJM_SyncAll_test 只有 39 行...
【问题讨论】:
-
一开始为什么要使用动态SQL?,好像没必要
-
嗯,就是这样。链接服务器 [LOCAL_MYSQL] 已启动并正在运行,但可能会发生无法访问的情况。在这种情况下,如果 sp_executesql 返回错误,我会执行其他操作。请注意,_upJM_SyncAll_test 只是本文的测试程序,_upJM_SyncAll 更复杂。
标签: sql-server linked-server msdtc