读书人

实施函数时声明的变量值让它固定?

发布时间: 2012-12-16 12:02:32 作者: rapoo

执行函数时,声明的变量值让它固定??
生成订单号的一个函数,

declare @order_no_new nvarchar(50)
set @order_no_new=(select dbo.Gen_Order_No())
在后面的语句中要重复用到@order_no_new,要怎样才能使得@order_no_new的值固定呢?

不知道大家明白我意思没。。。
[最优解释]
那就向tbl_order_detail表Insert的时候不要重新去取Gen_Order_No(),而是从主表tbl_order里获取201211060016单号就好了呀。

declare @order_no_new nvarchar(50)
set @order_no_new=(select dbo.Gen_Order_No())
假如@order_no_new = '201211060016'

Insert Into tbl_order(单号, 总额)
Values(@order_no_new, 1141.93)

Insert Into tbl_order_detail(单号, 小计)
Select @order_no_new, 259.00
Union
Select @order_no_new, 441.50
Union
Select @order_no_new, 50.00

还有一种方式,就是如果你的表设计的真的这么简单的话,完全可以先写子表,然后主表中将子表Group By一下回写回去就好了。


[其他解释]
额~~~你可以尝试再定义一个变量,这样就能保存
[其他解释]
不大明白楼主的意思!
要看你Gen_Order_No()中如何实现了,如果每执行一次都加一,那肯定每次都会变;如果每次执行时是从最大订单号加一,那数据没有保存时,随便执行几次都不会变。
楼主的写法:
declare @order_no_new nvarchar(50)
set @order_no_new=(select dbo.Gen_Order_No())
改为
declare @order_no_new nvarchar(50), @Order_No_New0 nvarchar(50)
Set @Order_No_New0 = =(select dbo.Gen_Order_No())
set @order_no_new = @order_no_new0
其实是一样的
[其他解释]

引用:
不大明白楼主的意思!
要看你Gen_Order_No()中如何实现了,如果每执行一次都加一,那肯定每次都会变;如果每次执行时是从最大订单号加一,那数据没有保存时,随便执行几次都不会变。
楼主的写法:
declare @order_no_new nvarchar(50)
set @order_no_new=(select dbo.Gen_Order_No())
改……

是每执行一次都+1,形式如:201211060016,后4位为流水号。


有2张表,tbl_order 和 tbl_order_detail,
两张表里都有order_no这一列,
我插入表时,生成一个订单号order_no,先插入tbl_order,且只插入1条记录,再插入tbl_order_detail,会有多条记录,但是order_no必须是相同的

tbl_order
单号 总额
2012110600161141.93

tbl_order_detail
单号 小计
201211060016259.00
201211060016441.50
20121106001650.00

我是先判断tbl_order里有没有201211060016这个,如果有,就插入tbl_order_detail。。


[其他解释]
所以我想把order_no生成以后变成一个固定的值,再去做判断。但是每次都是新的值、存储过程如下:
ALTER PROCEDURE [dbo].[AfterShoufei]
@xq_id nvarchar(50),
@xq_build nvarchar(50),
@roomno nvarchar(50),
@cst_code nvarchar(50),
@fee_code nvarchar(50),
@fee_name nvarchar(50),
@fee_singlemoney decimal(18,2),
@fee_totalmoney decimal(18,2),
@fee_remark nvarchar(50),
@month_qty int,
@month_section nvarchar(50),
@total_money decimal(18,2)

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

declare @shoufeitime datetime


set @shoufeitime=(Select CONVERT(varchar(100), GETDATE(), 20))

declare @order_no nvarchar(50)
declare @order_no_new nvarchar(50)

set @order_no_new=(select dbo.Gen_Order_No())
set @order_no=@order_no_new



if exists (select order_no from tbl_order where order_no=@order_no)

goto InsertDetail

insert tbl_order(order_no, total_money, shoufeidate)
values(@order_no,@total_money,@shoufeitime)

InsertDetail:
insert tbl_order_detail
(order_no,xq_id,xq_build,roomno,cst_code,fee_code,fee_name ,month_qty,month_section,fee_singlemoney,fee_totalmoney,fee_remark,shoufeidate)
values(@order_no,@xq_id,@xq_build,@roomno,@cst_code,@fee_code,@fee_name,@month_qty,@month_section,@fee_singlemoney,@fee_totalmoney,@fee_remark,@shoufeitime)



END


[其他解释]
goto InsertDetail  

永远没有机会执行啊
[其他解释]
引用:
所以我想把order_no生成以后变成一个固定的值,再去做判断。但是每次都是新的值、存储过程如下:


SQL code



1234567891011121314151617181920212223242526272829303132333435363738394041424344454647

ALTER PROCEDURE [dbo].[AfterShoufei] @xq……


你这种写法子表每次只能Insert一条数据,有多条数据就生成下一个单号了,主从表分开保存就好了,子表添加时获取主表的单号,不要通过Gen_Order_No()获取就好了!
[其他解释]
写得好看些
ALTER PROCEDURE [dbo].[AfterShoufei]
@singlemoney decimal(18,2),
@totalmoney decimal(18,2)
AS
BEGIN

SET NOCOUNT ON;

declare @order_no_new nvarchar(50)

set @order_no_new =(select dbo.Gen_Order_No())


if exists (select order_no from tbl_order where order_no=@order_no_new)

goto InsertDetail

insert tbl_order(order_no, totalmoney)
values(@order_no_new,@totalmoney)

InsertDetail:
insert tbl_order_detail
(order_no,singlemoney)
values(@order_no_new,@singlemoney)


END


InsertDetail是有机会执行的,我这是可以的。
[其他解释]
查询结果如下:
2012110600161141.93
2012110600171141.93
2012110600181141.93

2012110600161.20
2012110600172.00
201211060018350.00

但是我想得到的查询结果应该是:
2012110600161141.93

2012110600161.20
2012110600162.00
201211060016350.00
所以我才想把@order_no_new固定,不然它每次都会生成新的。
[其他解释]
引用:
引用:所以我想把order_no生成以后变成一个固定的值,再去做判断。但是每次都是新的值、存储过程如下:


SQL code



1234567891011121314151617181920212223242526272829303132333435363738394041424344454647

ALTER……


该如何从主表获取单号?我这个存储过程都不传入order_no这个参数的。
[其他解释]
放在变量里值赋值一次,怎么会变化。。。
[其他解释]
引用:
放在变量里值赋值一次,怎么会变化。。。

是的,确实是变了。
[其他解释]
引用:
那就向tbl_order_detail表Insert的时候不要重新去取Gen_Order_No(),而是从主表tbl_order里获取201211060016单号就好了呀。

declare @order_no_new nvarchar(50)
set @order_no_new=(select dbo.Gen_Order_No())
假如@order_no_ne……

先写字表,然后从子表里获取最大Order_no,然后从字表中选择插入tbl_order.


正解!
@Lyongt
谢谢!赶在下班前解决!哈哈。分送你了。
[其他解释]
感觉你写的代码就是确定的啊,除非你这个在循环里。

读书人网 >SQL Server

热点推荐