表變數在儲存過程或sql server中的運用

2021-09-06 05:01:53 字數 3806 閱讀 5137

經常遇見過這種情況,在儲存過程中經常用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,建立這個錶值變數的語法是:

1

use[

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 用於判斷臨時表是否存在中...