什么原因造成程序出现《select error:尝试启动新的sql server操作,结果未决》的错误,我修改了存储过程,问题消失了,可是不明白??详
前台的开发工具是pb,后台ms sql server
我在某个窗口执行了保存操作后(更新了menuwater表,此表有触发器更新romenum),就执行了如下的存储过程(第二种),倒是不报错,但是一打开与存储过程中更新的表(romenum)有关的窗口,就报错,错误如下:
select error:尝试启动新的sql server操作,结果未决
查了半天不知何故,因为最近还修改了存储过程和触发器,就查这两方面的原因
结果又把存储过程改成了第一种,这个提示就消失了!到底问题在哪里的,我改的最总要的地方是一个用了set XACT_ABORT ON一个没有用,
存储过程第一种写法(select 不报错的)::
CREATE PROCEDURE [op_settle_table_state] AS
declare @returnvalue int
set XACT_ABORT ON
set @returnvalue= - 100
begin tran
--设置用餐的房态
update romenum set rm_state=1
where exists
(select m_table from menuwater
where m_account=0 and menuwater.m_table=romenum.rm_id )
--设置用餐的合并数
update romenum set rm_merge=
(select count(*) from menuwater
where menuwater.m_account=0 and menuwater.m_table=romenum.rm_id
)
from romenum
--设置空闲的房态,合并台数,预定的和其他状态的(2.4)房态不能修改掉了
update romenum set rm_state=3,rm_merge =0
where not exists
(select m_table from menuwater
where m_account=0 and menuwater.m_table=romenum.rm_id )
and romenum.rm_state<>2 and romenum.rm_state<>4
if @@error=0 ---这个@@error能真正反映所有的sql是否执行成功么??这样写正确么?
set @returnvalue=100
select @returnvalue
commit tran
set XACT_ABORT OFF
GO
存储过程的第二种写法(造成select不正常的)
CREATE PROCEDURE [op_settle_table_state] AS
declare @returnvalue int
begin tran
--设置用餐的房态
update romenum set rm_state=1
where exists
(select m_table from menuwater
where m_account=0 and menuwater.m_table=romenum.rm_id )
if @@error<>0 goto lb_error
--设置用餐的合并数
update romenum set rm_merge=
(select count(*) from menuwater
where menuwater.m_account=0 and menuwater.m_table=romenum.rm_id
)
from romenum
if @@error<>0 goto lb_error
--设置空闲的房态,合并台数,预定的和其他状态的(2.4)房态不能修改掉了
update romenum set rm_state=3,rm_merge =0
where not exists
(select m_table from menuwater
where m_account=0 and menuwater.m_table=romenum.rm_id )
and romenum.rm_state<>2 and romenum.rm_state<>4
if @@error<>0 goto lb_error
select @@error
commit tran
lb_error:
select @@error
rollback tran
print '失败'
GO
应为触发器也更新了romenum表,也列在下面,不知道是不是相互影响了???
update触发器:
CREATE TRIGGER trg_u_menuwater ON menuwater
FOR update
AS
declare @m_account int,@m_old_account int
if not update(m_account)
return
select @m_account=m_account from inserted
select @m_old_account=m_account from deleted
if @m_account=0 return
if @m_old_account=1 return
UPDATE romenum
SET rm_state = 3--买单后设置为空闲
from romenum,inserted
WHERE romenum.rm_id = inserted.m_table
if @@error =0
commit tran
else
rollback tran
insert触发器:
CREATE TRIGGER trg_i_menuwater ON menuwater
FOR INSERT
AS
if @@error<>0
return
UPDATE romenum
SET rm_state = 1
from romenum,inserted
WHERE romenum.rm_id = inserted.m_table
if @@error =0
commit tran
else
rollback tran
触发器写的也是疑问多多,
如下的这段话,我删掉或不删系统一点也不报错,为什么?而且我在触发其中连begin tran都没有写呀,触发器中是否有一个隐含的事务???所以不用写么????
if @@error =0
commit tran
else
rollback tran
谢谢大家的帮助!我对于这个事务真是太糊涂了!谢谢!
我在某个窗口执行了保存操作后(更新了menuwater表,此表有触发器更新romenum),就执行了如下的存储过程(第二种),倒是不报错,但是一打开与存储过程中更新的表(romenum)有关的窗口,就报错,错误如下:
select error:尝试启动新的sql server操作,结果未决
查了半天不知何故,因为最近还修改了存储过程和触发器,就查这两方面的原因
结果又把存储过程改成了第一种,这个提示就消失了!到底问题在哪里的,我改的最总要的地方是一个用了set XACT_ABORT ON一个没有用,
存储过程第一种写法(select 不报错的)::
CREATE PROCEDURE [op_settle_table_state] AS
declare @returnvalue int
set XACT_ABORT ON
set @returnvalue= - 100
begin tran
--设置用餐的房态
update romenum set rm_state=1
where exists
(select m_table from menuwater
where m_account=0 and menuwater.m_table=romenum.rm_id )
--设置用餐的合并数
update romenum set rm_merge=
(select count(*) from menuwater
where menuwater.m_account=0 and menuwater.m_table=romenum.rm_id
)
from romenum
--设置空闲的房态,合并台数,预定的和其他状态的(2.4)房态不能修改掉了
update romenum set rm_state=3,rm_merge =0
where not exists
(select m_table from menuwater
where m_account=0 and menuwater.m_table=romenum.rm_id )
and romenum.rm_state<>2 and romenum.rm_state<>4
if @@error=0 ---这个@@error能真正反映所有的sql是否执行成功么??这样写正确么?
set @returnvalue=100
select @returnvalue
commit tran
set XACT_ABORT OFF
GO
存储过程的第二种写法(造成select不正常的)
CREATE PROCEDURE [op_settle_table_state] AS
declare @returnvalue int
begin tran
--设置用餐的房态
update romenum set rm_state=1
where exists
(select m_table from menuwater
where m_account=0 and menuwater.m_table=romenum.rm_id )
if @@error<>0 goto lb_error
--设置用餐的合并数
update romenum set rm_merge=
(select count(*) from menuwater
where menuwater.m_account=0 and menuwater.m_table=romenum.rm_id
)
from romenum
if @@error<>0 goto lb_error
--设置空闲的房态,合并台数,预定的和其他状态的(2.4)房态不能修改掉了
update romenum set rm_state=3,rm_merge =0
where not exists
(select m_table from menuwater
where m_account=0 and menuwater.m_table=romenum.rm_id )
and romenum.rm_state<>2 and romenum.rm_state<>4
if @@error<>0 goto lb_error
select @@error
commit tran
lb_error:
select @@error
rollback tran
print '失败'
GO
应为触发器也更新了romenum表,也列在下面,不知道是不是相互影响了???
update触发器:
CREATE TRIGGER trg_u_menuwater ON menuwater
FOR update
AS
declare @m_account int,@m_old_account int
if not update(m_account)
return
select @m_account=m_account from inserted
select @m_old_account=m_account from deleted
if @m_account=0 return
if @m_old_account=1 return
UPDATE romenum
SET rm_state = 3--买单后设置为空闲
from romenum,inserted
WHERE romenum.rm_id = inserted.m_table
if @@error =0
commit tran
else
rollback tran
insert触发器:
CREATE TRIGGER trg_i_menuwater ON menuwater
FOR INSERT
AS
if @@error<>0
return
UPDATE romenum
SET rm_state = 1
from romenum,inserted
WHERE romenum.rm_id = inserted.m_table
if @@error =0
commit tran
else
rollback tran
触发器写的也是疑问多多,
如下的这段话,我删掉或不删系统一点也不报错,为什么?而且我在触发其中连begin tran都没有写呀,触发器中是否有一个隐含的事务???所以不用写么????
if @@error =0
commit tran
else
rollback tran
谢谢大家的帮助!我对于这个事务真是太糊涂了!谢谢!
...全文
相关推荐
MySQL出现SQL Error (2013)连接错误的解决方法
MySQL中的SQL Error (2013)连接错误通常表示客户端在尝试与服务器建立连接时出现了问题,这可能是由于多种原因导致的。
SQL行转列实战:从PIVOT原理到跨库兼容方案
行转列是数据分析与报表开发中的基础数据整形技术,其核心在于将维度值(如年份、类别)动态转化为列名,并对指标进行分组聚合。该操作本质是分组+聚合+列重索引的三步坐标系映射,直接影响报表可维护性与下游宽表质量。掌握PIVOT语法逻辑可避免CASE WHEN硬编码陷阱,而结合条件聚合则能实现SQL Server、MySQL、PostgreSQL等多引擎兼容。在日活统计、销售年报、故障类型分布等典型场景中,合理选用静态PIVOT或动态SQL方案,可显著提升ETL稳定性与BI交付效率。本文深入拆解行转列的技术本质与生
SQL server存储过程语法及实例
在不同的数据库管理系统中,存储过程的实现和语法可能有所不同,但基本概念和使用方法大体上是相似的。在SQL Server中,存储过程还能够接受输入参数和返回输出参数,能够与应用程序直接交互。
SQL Server存储过程模板
### SQL Server 存储过程模板知识点详解#### 一、概述存储过程是预先编译并存储在数据库中的SQL代码块。使用存储过程可以提高应用程序性能,并有助于保持数据的一致性和完整性。
SQL Server查詢可用磁盘空间
**返回结果或抛出错误**:如果指定驱动器的可用空间大于等于`@minMBfree`,则存储过程正常结束;反之,则抛出一个错误消息“***ERROR***-磁盤空間不足!”。5.


疑难问题
