我心里的高手是你吗?答出来200分 关于SQL存储过程(200分)

  • 主题发起人 主题发起人 fanybul
  • 开始时间 开始时间
F

fanybul

Unregistered / Unconfirmed
GUEST, unregistred user!
有三个表,table1(good_id,amount) table2(good_id,amount) table3(good_id,amount)
1 10 1 50 1 100
2 5 2 50 2 200
3 100 3 20
操作结束后:table1(good_id,amount) table2(good_id,amount) table3(good_id,amount)
   1 10 1 40 1  110
  2 5 2 45 2  205
3 100 3 20
但是只有table1的表名是确定的;table2和table3的名是不定的,也是就变量。
有高手吗?
如果对问题不明还可以问的,我在线等我心中的高手出现。
 
俺不是高手
 
事先声明,有存储过程实现。
 
CREATE PROCEDURE change
@billno varchar(20),
@Storehouse_chu varchar(20),
@Storehouse_ru varchar(20)
AS
----' where temp_Kaidan.good_no=@Storehouse_chu.@goodno and temp_Kaidan.good_no=@Storehouse_ru.@goodno '@Storehouse_chu,@Storehouse_ru
----set @SQLString = 'select temp_Kaidan.good_no,temp_Kaidan.good_number,@Storehouse_chu.Good_amount1,@Storehouse_ru.Good_amount2 from temp_Kaidan,@Storehouse_chu,@Storehouse_ru' +
--@Storehouse_chu,temp_Kaidan,@Storehouse_ru +
-----EXEC (@SQLString)
-----for select temp_Kaidan.good_no,temp_Kaidan.good_number,Main_Storehouse.Good_amount from temp_Kaidan,Main_Storehouse where Main_Storehouse.good_no=temp_Kaidan.good_no
DECLARE @SQLString1 nvarchar(2000)
DECLARE @SQLString2 nvarchar(2000)
DECLARE @SQLString3 nvarchar(2000)
DECLARE @SQLString4 nvarchar(2000)
DECLARE @SQLString5 nvarchar(4000)
DECLARE @SQLString6 nvarchar(4000)
set @SQLString1=@Storehouse_chu+'.Good_amount'
set @SQLString2=@Storehouse_ru+'.Good_amount'
set @SQLString3=@Storehouse_chu+'.good_no'
set @SQLString4=@Storehouse_ru+'.good_no'
---EXEC (@SQLString1)
---EXEC (@SQLString2)
---EXEC (@SQLString3)
---EXEC (@SQLString4)
insert into diaobo(bill_no,good_no,good_name,good_number,good_price)
select @billno,good_no,good_name,good_number,good_price from temp_Kaidan where good_no is not null

set @SQLString5=' temp_Kaidan.good_no,temp_Kaidan.good_number,'+@SQLString1+','+@SQLString2 +'from temp_Kaidan'+','+@Storehouse_chu+','+@Storehouse_ru +' where temp_Kaidan.good_no='+@SQLString4+' and temp_Kaidan.good_no='+@SQLString3
EXEC (@SQLString5)

DECLARE modifydata CURSOR
for select @SQLString5
OPEN modifydata
declare @tatal1 int,@tatal2 int,@data1 int,@data2 int,@data3 int,@no varchar(20)
FETCH NEXT FROM modifydata into @no,@data1,@data2,@data3
WHILE @@FETCH_STATUS = 0
BEGIN
select @tatal1=@data2-@data1 select @tatal2=@data3+@data1
update @Storehouse_chu set Good_amount=@tatal1 where good_no=@no
update @Storehouse_ru set Good_amount=@tatal2 where good_no=@no
FETCH NEXT FROM modifydata into @no,@data1,@data2,@data3
END
CLOSE modifydata
DEALLOCATE modifydata

delete from temp_Kaidan
GO

大家可以看看这个,可能会有点启发
 
什么数据库?表名不固定指的什么意思?用的表变量还是临时表,视图?
 
刚才的比较乱,看看这个吧,比较清晰。

CREATE PROCEDURE change
@billno varchar(20),
@Storehouse_chu varchar(20),
@Storehouse_ru varchar(20)
AS
DECLARE @SQLString1 nvarchar(2000)
DECLARE @SQLString2 nvarchar(2000)
DECLARE @SQLString3 nvarchar(2000)
DECLARE @SQLString4 nvarchar(2000)
DECLARE @SQLString5 nvarchar(4000)
DECLARE @SQLString6 nvarchar(4000)
set @SQLString1=@Storehouse_chu+'.Good_amount'
set @SQLString2=@Storehouse_ru+'.Good_amount'
set @SQLString3=@Storehouse_chu+'.good_no'
set @SQLString4=@Storehouse_ru+'.good_no'

set @SQLString5=' temp_Kaidan.good_no,temp_Kaidan.good_number,'+@SQLString1+','+@SQLString2 +'from temp_Kaidan'+','+@Storehouse_chu+','+@Storehouse_ru +' where temp_Kaidan.good_no='+@SQLString4+' and temp_Kaidan.good_no='+@SQLString3
EXEC (@SQLString5)

DECLARE modifydata CURSOR
for select @SQLString5
OPEN modifydata
declare @tatal1 int,@tatal2 int,@data1 int,@data2 int,@data3 int,@no varchar(20)
FETCH NEXT FROM modifydata into @no,@data1,@data2,@data3
WHILE @@FETCH_STATUS = 0
BEGIN
select @tatal1=@data2-@data1 select @tatal2=@data3+@data1
update @Storehouse_chu set Good_amount=@tatal1 where good_no=@no
update @Storehouse_ru set Good_amount=@tatal2 where good_no=@no
FETCH NEXT FROM modifydata into @no,@data1,@data2,@data3
END
CLOSE modifydata
DEALLOCATE modifydata

delete from temp_Kaidan
GO
 
hityou问的比较有意思啦,我现在一一作答啊
 
拿个例子来说吧,有一个临时表(table1),这个表的名是定的,就是说用定了这个表的。
还有两个是仓库的库存表,设定一个是出货的仓库(talbel2),一个是入货的仓库(table3)。
临时表记录的是商品调拨的记录,如good_id,amount。在其它的两个仓库库存表中也是有(good_id,amount)字段的。出库的是amount减少啦,入库的是amount增加啦
但是一个公司不是说就只有两个仓库的,很几个仓库的,所以仓库的表名就不定了。
 
这个问题的关键就是如何搞定这个数据表名是个变量的问题
 
if Object_ID('proc_test') is not null
drop proc proc_test
go
create proc proc_test (@table1 varchar(50), @table2 varchar(50), @table3 varchar(50))
as
begin
declare @sql varchar(8000)
set @sql = 'update ' + @table2 + ' set amount=a.amount-b.amount'
+ ' from '+@table2 + ' a join '+@table1 +' b on a.good_id=b.good_id'
exec (@sql)
set @sql = 'update ' + @table3 + ' set amount=a.amount+b.amount'
+ ' from '+@table3 + ' a join ' + @table1 + ' b on a.good_id=b.good_id'
exec (@sql)
end
go
 
exec proc_test 'table1','table2','table3'
 
我公布的代码是不能通过的。有错误的。
 
select * from table1
select * from table2
select * from table3
good_id amount
----------- -----------
1 10
2 5

(2 row(s) affected)

good_id amount
----------- -----------
1 40
2 45
3 100

(3 row(s) affected)

good_id amount
----------- -----------
1 110
2 205
3 20

(3 row(s) affected)
 
protossgffnxk
这个是做什么的?
if Object_ID('proc_test') is not null
drop proc proc_test
go
 
如果当前数据库中存在名为proc_test的存储过程,就将这个存储过程删除
 
protossgffnxk
我还没有看,我想再问你,你能改用游标的方式实现吗?
如果能行的吗,我再加你70分
 
为什么要用游标,可是可以,但用游标执行得会很慢
 
protossgffnxk:我看了你写的,我想应该能实现,我会马上到代码里试一下。
但是好像离我的意思有距离,我的主要目的是想看到有游标的方式实现。
你再试试吧,我想了一个上午了
 
用游标也是用一个varchar的变量存放你的代码,再用exec执行就可以了
 
实现不了
我试了
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部