设为首页 收藏本站
查看: 1673|回复: 0

[经验分享] 表变量在存储过程或sql server中的运用

[复制链接]

尚未签到

发表于 2015-6-29 11:29:24 | 显示全部楼层 |阅读模式
  经常遇见过这种情况,在存储过程中经常用with创建临时表,这个临时表这这个功能模块中多次运用,如果都用With创建相同功能的临时表,好性能和存储过程中有很多冗余代码,为此,我用表变量来实现此种功能(不是表值变量)
  定义表变量的语法:
  DECLARE 表变量名字 TABLE(
  列名 列类型 是否为空,
  列名 列类型 是否为空,
  列名 列类型 是否为空,
  列名 列类型 是否为空
  )
  下面是我这项目中运用的存储过程:


DSC0000.gif DSC0001.gif 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(@@ERROR0) 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(@@ERROR0) 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(@@ERROR0) 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(@@ERROR0) 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
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81477-1-1.html 上篇帖子: SQL Server 2012引入CONCAT函数 下篇帖子: SQL Server 2008空间数据应用系列一:空间信息基础
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表