經常遇見過這種情況,在儲存過程中經常用with建立臨時表,這個臨時表這這個功能模組中多次運用,如果都用with建立相同功能的臨時表,好效能和儲存過程中有很多冗餘**,為此,我用表變數來實現此種功能(不是錶值變數)
定義表變數的語法:
declare 表變數名字 table(
列名 列型別 是否為空,
列名 列型別 是否為空,
列名 列型別 是否為空,
列名 列型別 是否為空
下面是我這專案中運用的儲存過程:
1可以看到這上面的儲存過程中,定義乙個表變數,use[
xb_quotation_dev2]2
go34/*
***** object: storedprocedure [dbo].[usp_updatetodaypricemange] script date: 02/18/2012 14:34:43 ******/5
set ansi_nulls on6go
78set quoted_identifier on9go
1011
create
procedure
[dbo
].[usp_updatetodaypricemange]12
@dt ty_publictodayprice readonly
13as
14begin
15set nocount on;
16declare
@errorsmall
smallint=0;
17begin
tran;
18set
@errorsmall
=-1;
19declare
@dt_prices
table(areaid int
notnull ,goodsid int
notnull,guideprice decimal(18,4) not
null );
20with temp_1 as(
21select areaid,goodsid,guideprice from
@dt22
union
all23
select a.areaid,t.goodsid,t.guideprice from md_area a inner
join
@dt t
24on a.quotationtype= t.areaid
25and
exists(select
0from md_goods g where g.typeid=a.goodstypeid and g.id= t.goodsid)
26 )
27insert
into
@dt_prices
select areaid,goodsid,guideprice from temp_1;
28update up set up.guideprice=tp.guideprice from md_updateprice up inner
join
@dt_prices tp on up.areaid=tp.areaid and up.goodsid=tp.goodsid
29and
convert(varchar(10),up.pricedate,120)=
convert(varchar(10),getdate(),120)
30if(@@error
<>
0) goto error_handler;
31set
@errorsmall
=-2;
32insert
into md_updateprice(areaid,goodsid,guideprice, pricedate)
33select t.*,getdate() from
@dt_prices t where
notexists(select
0from md_updateprice up where up.areaid=t.areaid and up.goodsid= t.goodsid)
34if(@@error
<>
0) goto error_handler;
35set
@errorsmall
=-3;
36update h set h.guideprice=t.guideprice from md_historyprices h,@dt_prices t where h.goodsid = t.goodsid
37and h.areaid=t.areaid and
convert(varchar(10),h.pricedate,120)=
convert(varchar(10),getdate(),120);
38if(@@error
<>
0) goto error_handler;
39set
@errorsmall
=-4;
40update p set p.guideprice=tt.guideprice from md_prices p inner
join
@dt_prices tt
41on p.goodsid = tt.goodsid and
42 p.areaid =tt.areaid and
convert(varchar(10),p.pricedate,120)=
convert(varchar(10),getdate(),120);
43if(@@error
<>
0) goto error_handler;
44commit
tran;
45return
0;46 error_handler:
47rollback
tran;
48return
@errorsmall;
49end
5051
5253
go
declare @dt_prices table(areaid int not null ,goodsid int not null,guideprice decimal(18,4) not null );
此表變數@dt_prices 有3列,分別是areaid,goodsid,guideprice,他們型別分別是整形,整形,雙精度,都是非空;
可以看到在下面的功能模組中我分別用到這個表變數@dt_prices
對於上面的儲存過程,我定義了乙個錶值變數ty_publictodayprice,建立這個錶值變數的語法是:
1use[
xb_quotation_dev2]2
go34/*
***** object: userdefinedtabletype [dbo].[ty_publictodayprice] script date: 02/18/2012 14:43:42 ******/5
create type [
dbo].[
ty_publictodayprice]as
table(6[
areaid][
int]
notnull,7[
goodsid][
int]
notnull,8[
guideprice][
decimal
](18, 4) null
9 )10
go
SQLserver 表變數 事務 儲存過程
在t sql中使用變數 一 區域性變數 1宣告變數 age和 name declare age int declare name nvarchar 5 2賦值 1 方法1 set age 18 set name 張飛 2 方法2 select age 18 select name 張飛 3分別使用s...
mysql儲存過程表作為變數
create definer root procedure create table by unit top id out out result int 8 begin 結束標識定義 declare edone int default 0 結果集 declare result date varcha...
儲存過程示例 在儲存過程中使用臨時表
create or replace procedure product temp update prc aspc delestr varchar2 50 刪除臨時表記錄語句 pc createstr varchar2 500 建立臨時表 tabext varchar2 10 用於判斷臨時表是否存在中...