表變數在預存程序或sql server中的運用

來源:互聯網
上載者:User

經常遇見過這種情況,在預存程序中經常用with建立暫存資料表,這個暫存資料表這這個功能模組中多次運用,如果都用With建立相同功能的暫存資料表,好效能和預存程序中有很多冗餘代碼,為此,我用表變數來實現此種功能(不是表值變數)

定義表變數的文法:

DECLARE 表變數名字 TABLE(

列名 列類型 是否為空白,

列名 列類型 是否為空白,

列名 列類型 是否為空白,

列名 列類型 是否為空白

)

下面是我這項目中運用的預存程序:

PROC

 1 USE [xb_quotation_dev2]
2 GO
3
4 /****** Object: StoredProcedure [dbo].[usp_UpdateTodayPriceMange] Script Date: 02/18/2012 14:34:43 ******/
5 SET ANSI_NULLS ON
6 GO
7
8 SET QUOTED_IDENTIFIER ON
9 GO
10
11 CREATE PROCEDURE [dbo].[usp_UpdateTodayPriceMange]
12 @dt Ty_PublicTodayPrice READONLY
13 AS
14 BEGIN
15 SET NOCOUNT ON;
16 DECLARE @ERRORSMALL SMALLINT =0;
17 BEGIN TRAN;
18 SET @ERRORSMALL=-1;
19 DECLARE @dt_Prices TABLE(AreaID INT NOT NULL ,GoodsId INT NOT NULL,GuidePrice DECIMAL(18,4) NOT NULL );
20 WITH temp_1 AS(
21 SELECT AreaID,GoodsId,GuidePrice FROM @dt
22 UNION ALL
23 SELECT a.AreaId,t.GoodsId,t.GuidePrice FROM MD_Area a INNER JOIN @dt t
24 ON a.QuotationType= t.AreaID
25 AND EXISTS(SELECT 0 FROM MD_Goods g WHERE g.TypeId=a.GoodsTypeId AND g.ID= t.GoodsId)
26 )
27 INSERT INTO @dt_Prices SELECT AreaID,GoodsId,GuidePrice FROM temp_1;
28 UPDATE 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
29 AND CONVERT(VARCHAR(10),up.PriceDate,120)=CONVERT(VARCHAR(10),GETDATE(),120)
30 IF(@@ERROR<>0) GOTO ERROR_Handler;
31 SET @ERRORSMALL=-2;
32 INSERT INTO MD_UpdatePrice(AreaID,GoodsId,GuidePrice, PriceDate)
33 SELECT t.*,GETDATE() FROM @dt_Prices t WHERE NOT EXISTS(SELECT 0 FROM MD_UpdatePrice up WHERE up.AreaID=T.AreaID AND up.GoodsId= t.GoodsId)
34 IF(@@ERROR<>0) GOTO ERROR_Handler;
35 SET @ERRORSMALL=-3;
36 UPDATE h SET h.GuidePrice=t.GuidePrice FROM MD_HistoryPrices h,@dt_Prices t WHERE h.GoodsId = t.GoodsId
37 AND h.AreaID=t.AreaID AND CONVERT(VARCHAR(10),h.PriceDate,120)=CONVERT(VARCHAR(10),GETDATE(),120);
38 IF(@@ERROR<>0) GOTO ERROR_Handler;
39 SET @ERRORSMALL=-4;
40 UPDATE p SET p.GuidePrice=tt.GuidePrice FROM MD_Prices p inner join @dt_Prices tt
41 on P.GoodsId = tt.GoodsId AND
42 p.AreaID =tt.AreaID AND CONVERT(VARCHAR(10),p.PriceDate,120)=CONVERT(VARCHAR(10),GETDATE(),120);
43 IF(@@ERROR<>0) GOTO ERROR_Handler;
44 COMMIT TRAN;
45 RETURN 0;
46 ERROR_Handler:
47 ROLLBACK TRAN;
48 RETURN @ERRORSMALL;
49 END
50
51
52
53 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 GO
3
4 /****** Object: UserDefinedTableType [dbo].[Ty_PublicTodayPrice] Script Date: 02/18/2012 14:43:42 ******/
5 CREATE TYPE [dbo].[Ty_PublicTodayPrice] AS TABLE(
6 [AreaID] [int] NOT NULL,
7 [GoodsId] [int] NOT NULL,
8 [GuidePrice] [decimal](18, 4) NULL
9 )
10 GO

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.