我创建了一存储过程,在执行的时候出现了以下错误:
服务器: 消息 7391,级别 16,状态 1,过程 tri_sfgq,行 4
该操作未能执行,因为 OLE DB 提供程序 'sqloledb' 无法启动分布式事务。
[OLE/DB provider returned message: 不能在指定的事务处理器中获得新事务。
请问各位各手这是什么原因啊,怎么去解决?
CREATE procedure up_ggdj_save
@ggfbtb_fbid int,
@tjtb_djsj datetime,
@tjtb_yhip varchar(20),
@ggtb_yxipsj int,
@tjtb_djhxs char(1)
as
declare @zdsj datetime , @ipsfyx char(1)if not exists (select yhip from ggxtdb_tjtb where yhip=@tjtb_yhip)
begin
insert into ggxtdb_tjtb (fbid,djsj,djhxs,yhip,sfyx)
values (@ggfbtb_fbid,@tjtb_djsj,@tjtb_djhxs,@tjtb_yhip,'0')
endelse
begin
select @zdsj=max(ggxtdb_tjtb.djsj)
from ggxtdb_tjtb
where ggxtdb_tjtb.yhip=@tjtb_yhip and ggxtdb_tjtb.sfyx='0'
end
if(datediff(mm,@zdsj,@tjtb_djsj)>=@ggtb_yxipsj)begin
insert into ggxtdb_tjtb (fbid,djsj,djhxs,yhip,sfyx)
 values (@ggfbtb_fbid,@tjtb_djsj,@tjtb_djhxs,@tjtb_yhip,'0')
endelse
begin
insert into ggxtdb_tjtb (fbid,djsj,djhxs,yhip,sfyx)
 values (@ggfbtb_fbid,@tjtb_djsj,@tjtb_djhxs,@tjtb_yhip,'1')
end 
GO
exec up_ggdj_save 1,'2006-8-6 16:40:40','192.168.1.201',11,'0'

解决方案 »

  1.   


    else
    begin
    select @zdsj=max(ggxtdb_tjtb.djsj)
    from ggxtdb_tjtb
    where ggxtdb_tjtb.yhip=@tjtb_yhip and ggxtdb_tjtb.sfyx='0'
    end
    if(datediff(mm,@zdsj,@tjtb_djsj)>=@ggtb_yxipsj)begin
    insert into ggxtdb_tjtb (fbid,djsj,djhxs,yhip,sfyx)
     values (@ggfbtb_fbid,@tjtb_djsj,@tjtb_djhxs,@tjtb_yhip,'0')
    endelse
    begin
    insert into ggxtdb_tjtb (fbid,djsj,djhxs,yhip,sfyx)
     values (@ggfbtb_fbid,@tjtb_djsj,@tjtb_djhxs,@tjtb_yhip,'1')
    end 
    上面的一块有问题if ... else ...
    的结构只能是
    if ...
    begin ...end
    else
    begin ...end而你上面的结构变成了
    if ...
    begin ...end
    else
    begin...end
    begin ... end
    else
    begin ...end所有你的存储过程要出错阿
      

  2.   

    CREATE procedure up_ggdj_save
    @ggfbtb_fbid int,
    @tjtb_djsj datetime,
    @tjtb_yhip varchar(20),
    @ggtb_yxipsj int,
    @tjtb_djhxs char(1)
    as
    declare @zdsj datetime , @ipsfyx char(1)if not exists (select yhip from ggxtdb_tjtb where yhip=@tjtb_yhip)
    begin
    insert into ggxtdb_tjtb (fbid,djsj,djhxs,yhip,sfyx)
    values (@ggfbtb_fbid,@tjtb_djsj,@tjtb_djhxs,@tjtb_yhip,'0')
    endelse
    begin
    select @zdsj=max(ggxtdb_tjtb.djsj)
    from ggxtdb_tjtb
    where ggxtdb_tjtb.yhip=@tjtb_yhip and ggxtdb_tjtb.sfyx='0'if(datediff(mm,@zdsj,@tjtb_djsj)>=@ggtb_yxipsj)begin
    insert into ggxtdb_tjtb (fbid,djsj,djhxs,yhip,sfyx)
     values (@ggfbtb_fbid,@tjtb_djsj,@tjtb_djhxs,@tjtb_yhip,'0')
    endelse
    begin
    insert into ggxtdb_tjtb (fbid,djsj,djhxs,yhip,sfyx)
     values (@ggfbtb_fbid,@tjtb_djsj,@tjtb_djhxs,@tjtb_yhip,'1')
    end endGO
      

  3.   

    转:服务器: 消息 7391,级别 16,状态 1,行 6
    该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分
    布式事务。
    [OLE/DB provider returned message: 不能在指定的事务处理器中
    获得新事务。]
    ---------------------------------------------------------------------------------------------
    服务器: 消息 8520,级别 20,状态 1,行 8
    内部 MSDTC 事务的提交失败: Result Code = 0x8004d019。连接中断
    ---------------------------------------------------------------------------------------------这个问题,我想做过MS SQLServer分布式数据库系统的人都遇到过。简单的时候是服务没启动,135端口没打开之类的。但等你将这些东西都搞定后仍然不行的时候,你就会感到绝望并且怀疑是不是MS根本就不能使用OLEDB来启动分布式事务了。其实,很多时候一个问题在出现的时候会让你觉得神秘,但解决起来其实很简单。下面就是答案:1、运行 regedt32,浏览至 HKEY_LOCAL_MACHINE\Software\Microsoft\MSDTC。
    添加一个 DWORD 值 TurnOffRpcSecurity,值数据为 1。
    2、重启MS DTC服务。
    3、打开“管理工具”的“组件服务”。
    a.  浏览至"启动管理工具"。 
    b.  选择"组件服务"。 
    c.  展开"组件服务"树,然后展开"我的电脑"。 
    d.  右键单击"我的电脑",然后选择"属性"。 
     在 MSDTC 选项卡中,确保选中了下列选项: 
    网络 DTC 访问网络管理网络事务XA 事务
    另外,"DTC 登录帐户"一定要设置为"NT Authority\NetworkService"。 
    4、重启MS DTC服务。
    5、再次运行 regedt32,浏览至 HKEY_LOCAL_MACHINE\Software\Microsoft\MSDTC,然后删除 TurnOffRpcSecurity 项。
    微软提供的原文:aspx?scid=kb;zh-cn;329332">http://support.microsoft.com/default.aspx?scid=kb;zh-cn;329332