日期:2014-05-18  浏览次数:20509 次

远程数据库插入问题?
insert   into   [58.125.36.148].sms.dbo.sm_in(serv_no,   serv_prov,   send_date,   sender,   content,   status,   link_id)  
values(@serv_no,   @serv_prov,   @date,   @sender,   @content,   @status,   @linkid)

将上面语句放在a表的触发器里,a表插入数据,有如下错误:

服务器:   消息   7391,级别   16,状态   1,过程   trigSMinsert,行   83
该操作未能执行,因为   OLE   DB   提供程序   'SQLOLEDB '   无法启动分布式事务。
[OLE/DB   provider   returned   message:   新事务不能登记到指定的事务处理器中。   ]
OLE   DB   错误跟踪[OLE/DB   Provider   'SQLOLEDB '   ITransactionJoin::JoinTransaction   returned   0x8004d00a]。

但是将语句单独放在查询分析器里执行,可以成功的插入到远程服务器的数据库里。

这是怎么回事,急,望知道的朋友,指教下,我在线等。

------解决方案--------------------
--创建链接服务器
exec sp_addlinkedserver 'srv_lnk ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
exec sp_addlinkedsrvlogin 'srv_lnk ', 'false ',null, '用户名 ', '密码 '
go

--查询示例
select * from srv_lnk.数据库名.dbo.表名

--导入示例
select * into 表 from srv_lnk.数据库名.dbo.表名

--以后不再使用时删除链接服务器
exec sp_dropserver 'srv_lnk ', 'droplogins '
go

--如果只是临时访问,可以直接用openrowset
--查询示例
select * from openrowset( 'SQLOLEDB '
, 'sql服务器名 '; '用户名 '; '密码 '
,数据库名.dbo.表名)


--导入示例
select * into 表 from openrowset( 'SQLOLEDB '
, 'sql服务器名 '; '用户名 '; '密码 '
,数据库名.dbo.表名)
------解决方案--------------------
在使用楼上的代码之前,先到服务里去开启distributed transaction服务