100分求判断的写法,虽然我没有多少可用分.

poloyzhang 2010-06-17 05:31:53
我用程序把excel导入sqlserver,本来我是建立了一个触发器 after instered .
但是没有执行. 只有计算列自动计算出结果了
然后我想把触发器改为存储过程,在编程中调用. 只要点一下计算按钮,则自动执行所有行的计算.现在问题是,
这个判断语句如何写.
假设有如下列, 基本工资, 级别工资, 工资合计( 计算列, 工资合计= 基本工资+级别工资) 其它扣款,扣住宿费, 实发工资.
实发工资= 工资合计 - 其它扣款 -扣住宿费

if( 刚刚导入的语句) 为真,
则更新应发工资.
或者, 直接 while( 从第一行至最后一行)直到行的结尾. 都计算一篇.


我要的是这个判断如何写.
...全文
263 52 打赏 收藏 转发到动态 举报
写回复
用AI写文章
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
永生天地 2010-06-18
  • 打赏
  • 举报
回复
declare cur cursor for select 列A,列B,列C,列ABC,列d,列e,列f from tb --这句语句是得到列名吗?
open cur
fetch next from cur into @列a , @列b , @列c , @列abc , @列d , @列e , @列f ---这句语句是得到前面的值吗?
while @@fetch_status=0 ------------------------这儿是如何中断循环的? .

fetch next from cur 时如果下一行没有就@@fetch_status=-2

--执行下移一行是否这样写也自动得到值了?
fetch next from cur into @列a , @列b , @列c , @列abc , @列d , @列e , @列f


@@FETCH_STATUS
返回被 FETCH 语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。

返回值 描述
0 FETCH 语句成功。
-1 FETCH 语句失败或此行不在结果集中。
-2 被提取的行不存在。


语法
@@FETCH_STATUS

返回类型
integer

注释
由于 @@FETCH_STATUS 对于在一个连接上的所有游标是全局性的,要小心使用 @@FETCH_STATUS 。在执行一条 FETCH 语句后,必须在对另一游标执行另一 FETCH 语句前测试 @@FETCH_STATUS 。在任何提取操作出现在此连接上前,@@FETCH_STATUS 的值没有定义。

例如,用户从一个游标执行一条 FETCH 语句,然后调用一个存储过程,此存储过程打开并处理另一个游标的结果。当控制从被调用的存储过程返回后,@@FETCH_STATUS 反映的是在存储过程中执行的最后的 FETCH 语句的结果,而不是在存储过程被调用之前的 FETCH 语句的结果。

示例
下面的示例用 @@FETCH_STATUS 控制在一个 WHILE 循环中的游标活动。

DECLARE Employee_Cursor CURSOR FOR
SELECT LastName, FirstName FROM Northwind.dbo.Employees
OPEN Employee_Cursor
FETCH NEXT FROM Employee_Cursor
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM Employee_Cursor
END
CLOSE Employee_Cursor
DEALLOCATE Employee_Cursor

poloyzhang 2010-06-18
  • 打赏
  • 举报
回复
可能是死循环了.
declare cur cursor for select 列A,列B,列C,列ABC,列d,列e,列f from tb --这句语句是得到列名吗?
open cur
fetch next from cur into @列a , @列b , @列c , @列abc , @列d , @列e , @列f ---这句语句是得到前面的值吗?
while @@fetch_status=0 ------------------------这儿是如何中断循环的? .
--执行下移一行是否这样写也自动得到值了?
fetch next from cur into @列a , @列b , @列c , @列abc , @列d , @列e , @列f
永生天地 2010-06-18
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 poloyzhang 的回复:]
是不是存储过程写错了? 按道理是不应该执行这么慢吧.
[/Quote]
可能是写的有错误
poloyzhang 2010-06-18
  • 打赏
  • 举报
回复
我才两行记录啊.
poloyzhang 2010-06-18
  • 打赏
  • 举报
回复
是不是存储过程写错了? 按道理是不应该执行这么慢吧.
poloyzhang 2010-06-18
  • 打赏
  • 举报
回复
做了这种光标的存储过程,但是怎么执行很慢, 是不是第一次执行要编译还是什么.现在还在执行中.

因为我执行了一次就马上作一个查询........................

realclimax 2010-06-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xcliang2004 的回复:]
update 工资表 set 工资合计=CONVERT(decimal,基本工资)+CONVERT(decimal,级别工资),实发工资= CONVERT(decimal,基本工资)+CONVERT(decimal,级别工资) - CONVERT(decimal,其它扣款) -CONVERT(decimal,扣住宿费)
[/Quote]

尝试这种方法
永生天地 2010-06-18
  • 打赏
  • 举报
回复
不用case就用游标循环


begin
declare @列a decimal( 9,2)
declare @列b decimal( 9,2)
declare @列c decimal( 9,2)
declare @列abc decimal( 9,2)
declare @列d decimal( 9,2)
declare @列e decimal( 9,2)
declare @列f decimal( 9,2)
declare cur cursor for select 列A,列B,列C,列ABC,列d,列e,列f from tb
open cur
fetch next from cur into @列a , @列b , @列c , @列abc , @列d , @列e , @列f
while @@fetch_status=0
begin
if( @列d = '员工')
begin
Set @列abc = @列a + @列b +@列c
set @列e = @列abc * @列a * 0.8

---------------some caculate
end
if( @列d = '职员')
begin
Set @列abc = @列a + @列b +@列c
set @列e = @列abc * @列a * 0.2
end
---------------some caculate
set @列f = @列e- @列a


--但是最终更新的时候我是这样写的.--- 游标更新的方法 WHERE CURRENT OF cur
update tb set 列abc = @列A, 列f = @列f --, 列g = @列g-- .................
WHERE CURRENT OF cur


--执行下移一行
fetch next from cur into @列a , @列b , @列c , @列abc , @列d , @列e , @列f

end

end

poloyzhang 2010-06-18
  • 打赏
  • 举报
回复
另外这么多的语句块,能否拆解一个一个计算,实际的值不止一个呢.计算出来的值后面又要用到.
计算完后再update .
如果update 是多行,就会出现我上面的错误..........什么子查询之类的.

写成存储过程如何弄的. 让数据库计算完一条后,计算下一行...................................................................
poloyzhang 2010-06-18
  • 打赏
  • 举报
回复
具体语法说明是如何的?
poloyzhang 2010-06-18
  • 打赏
  • 举报
回复
我是这样写的,
begin
declare @列a decimal( 9,2)
declare @列b decimal( 9,2)
declare @列c decimal( 9,2)
declare @列abc decimal( 9,2)
declare @列d decimal( 9,2)
declare @列e decimal( 9,2)
declare @列f decimal( 9,2)
select @列a = (select 列A FROM table)
select @列b = (select 列A FROM table)
select @列c = (select 列A FROM table)
select @列abc = (select 列A FROM table)
select @列d = (select 列A FROM table)
select @列e = (select 列A FROM table)
select @列e = (select 列A FROM table)
if( @列d = '员工')
begin
Set @列abc = @列a + @列b +@列c
set @列e = @列abc * @列a * @0.8

---------------some caculate
end
if( @列d = '职员')
begin
Set @列abc = @列a + @列b +@列c
set @列e = @列abc * @列a * @0.2
end
---------------some caculate
set @列f = @列e- @列a


但是最终更新的时候我是这样写的.
update table set 列abc = @列A, 列f = @列f . 列g = @列g .................

end

然后我执行存储过程却不对.
消息 512,级别 16,状态 1,过程 updateSalary,第 50 行
子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。

---------------------------------------------
可能是更新的写法不对.
一定要用那个 case ------------------then ---------------------when 之类的吗?


具体语法是如何的?
poloyzhang 2010-06-18
  • 打赏
  • 举报
回复
终于一步步搞定了.............................
其间也学到不少东西.

感谢永生哥, 期间的无私帮助............................................................结贴
完美收官.
jesse9898 2010-06-18
  • 打赏
  • 举报
回复
[Quote=引用 50 楼 poloyzhang 的回复:]

是点中数据库单击右键吗? 还是如何.
[/Quote]

完全正确
poloyzhang 2010-06-18
  • 打赏
  • 举报
回复
是点中数据库单击右键吗? 还是如何.
poloyzhang 2010-06-18
  • 打赏
  • 举报
回复
怎么发给你? 油箱,还是qq还是msn 还是skype 或者其它.
poloyzhang 2010-06-18
  • 打赏
  • 举报
回复
是不是我连表和记录都发给你一下. 然后执行一下这个存储过程.......................................................................................................帮我啊.---------------------SQL的调试没有c#调试方便啊/
永生天地 2010-06-18
  • 打赏
  • 举报
回复
我在express版里调试过,很好用
[Quote=引用 46 楼 poloyzhang 的回复:]
我的单击右键没有 应用程序调试,可能是我安装的是sqlexpress 版本.
[/Quote]
poloyzhang 2010-06-18
  • 打赏
  • 举报
回复
我的单击右键没有 应用程序调试,可能是我安装的是sqlexpress 版本.
poloyzhang 2010-06-18
  • 打赏
  • 举报
回复
是不是不能用光标. 还是我直接加一列 自增长的.
然后从第一行 update到最后一行就行了.
现在怎么整不好?
poloyzhang 2010-06-18
  • 打赏
  • 举报
回复
线程 '.\SQLEXPRESS [52]' (0x950) 已退出,返回值为 0 (0x0)。
应该是整个 while 循环没有执行.

但是我是有记录的.我数据库有两条记录.
加载更多回复(32)

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧