两台数据库PC,分别为:DB1,DB2, 都是Sql Server 2000 企业版,相应的数据库:DB1:DEMO,DB2:TEST。在DB1上新建表:CREATE TABLE [dbo].[Visit200601] (
[ID] [uniqueidentifier] NOT NULL ,
[Code] [int] NOT NULL ,
[UserIP] [varchar] (16) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[VisitDate] [datetime] NOT NULL ,
[UserID] [uniqueidentifier] NULL 
) ON [PRIMARY]
GOALTER TABLE [dbo].[Visit200601] WITH NOCHECK ADD 
 PRIMARY KEY  CLUSTERED 
(
[ID],
[Code],
[UserIP],
[VisitDate]
)  ON [PRIMARY] 
GOALTER TABLE [dbo].[Visit200601] ADD 
CONSTRAINT [UQ_Visit200601_id] UNIQUE  NONCLUSTERED 
(
[ID]
)  ON [PRIMARY] ,
CONSTRAINT [CHK_Visit200601_VisitDate] CHECK ([VisitDate] >= '2006-01-01' and [VisitDate] < '2006-02-01')
GO
在DB2上新建表:CREATE TABLE [dbo].[Visit200602] (
[ID] [uniqueidentifier] NOT NULL ,
[Code] [int] NOT NULL ,
[UserIP] [varchar] (16) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[VisitDate] [datetime] NOT NULL ,
[UserID] [uniqueidentifier] NULL 
) ON [PRIMARY]
GOALTER TABLE [dbo].[Visit200602] WITH NOCHECK ADD 
 PRIMARY KEY  CLUSTERED 
(
[ID],
[Code],
[UserIP],
[VisitDate]
)  ON [PRIMARY] 
GOALTER TABLE [dbo].[Visit200602] ADD 
CONSTRAINT [UQ_Visit200601_id] UNIQUE  NONCLUSTERED 
(
[ID]
)  ON [PRIMARY] ,
CONSTRAINT [CHK_Visit200601_VisitDate] CHECK ([VisitDate] >= '2006-02-01' and [VisitDate] < '2006-03-01')
GO
建立链接服务器在DB1上建立链接服务器
exec  sp_addlinkedserver
@server='DB2', 
@srvproduct='',
@provider='SQLOLEDB', 
@datasrc='DB2'
go
exec  
sp_addlinkedsrvlogin  
@rmtsrvname = 'DB2',
@useself =  'false', 
@rmtuser =  'sa', 
@rmtpassword = 'password' 
go
在DB2上建立链接服务器
exec  sp_addlinkedserver
@server='DB1', 
@srvproduct='',
@provider='SQLOLEDB', 
@datasrc='DB1'
go
exec  
sp_addlinkedsrvlogin  
@rmtsrvname = 'DB1',
@useself =  'false', 
@rmtuser =  'sa', 
@rmtpassword = 'password' 
go
设置相应的属性值
在DB1上更改
Exec sp_serveroption 'DB2', 'lazy schema validation', 'true'在DB2上更改
Exec sp_serveroption 'DB1', 'lazy schema validation', 'true'创建相应的视图
在DB1上创建
create view vVisitList as
select * from visit200601
union all
select * from DB2.test.dbo.visit200602在DB2上创建
create view vVisitList as
select * from DB1.demo.dbo.visit200601
union all
select * from visit200602执行查询
SELECT * FROM vVisitList 没有问题,可以正常执行执行添加
set STATISTICS IO  on
set xact_abort on
INSERT INTO vVisitList values(newid(),'1001','127.0.0.1','2006-01-14',null)出现问题,问题描述:
服务器: 消息 7391,级别 16,状态 1,行 1
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]
OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。
后来到网上查了一下相应的问题解决方案,我按照
http://www.studycn.org/it/sjkxg/4515.htm
这里的方法进行了相应的更改。但是问题依旧。
实在不知道问题出在哪里,请各位帮忙看看问题出在哪里,谢谢了!!!

解决方案 »

  1.   

    我也是在操作远程数据库中出现这样的问题
    我查询时没有,在向一远程数据库中插入就出现了
    插入数据时提示“该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务”不知道怎么解决,哪位高手进来说说啊
      

  2.   

    sql 2000 打上sp3以上的补定后试试.
      

  3.   

    环境:
    操作系统:windows Server  2003 Enterprise + sp1
    数据库: Sql Server 2000 + SP4
      

  4.   

    忘说了:Sql Server 2000 是 企业版
      

  5.   

    右击创建的连接服务器→属性→服务器选项,将RPC和RPC输出选中试试
      

  6.   

    我也是,不过我用SP3补丁,XP系统
    insert into openrowset('sqloledb','LYH';'RJ';'000',RJ20050823A.dbo.dept)(dept_id,dept_name,status) values('001','测试','0') 
    和这种我全试了还是不行的
    --添加数据
    insert into 自定义名.数据库名.dbo.表名(列1,列2,...) values(值1,值2,...)
      

  7.   

    去掉:
    set xact_abort on 这句还报错误吗??
      

  8.   

    to andy1995:
    你提供的方法行不通
    to zlp321002:
    你的方法也不行
      

  9.   

    我的就没有加set xact_abort on 的,也是不行的。
      

  10.   

    http://support.microsoft.com/default.aspx?scid=kb;zh-cn;329332看看这里
      

  11.   

    问题解决了
    我原来只在DB1上做下面所述的更改,而没在DB2上更改,在DB2上更改后,就可以了
    http://www.studycn.org/it/sjkxg/4515.htm现在出了一个新的问题,就是防火墙的问题,如果开户防火墙,上面的操作是不能成功的,但是关闭防火墙就OK,现在正在和防火墙作斗争呢