博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
表变量在存储过程或sql server中的运用
阅读量:6933 次
发布时间:2019-06-27

本文共 3271 字,大约阅读时间需要 10 分钟。

经常遇见过这种情况,在存储过程中经常用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

 

 

转载地址:http://pfgjl.baihongyu.com/

你可能感兴趣的文章
关于行号输出的简单命令
查看>>
序列化和反序列化
查看>>
调用天气预报Web Service
查看>>
&#x开头的是什么编码呢。浏览器可以解释它。如中国等同与中文"中国"?
查看>>
Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.
查看>>
新版本来袭:Apache Spark 1.5新特性介绍
查看>>
pthread_create()之前的属性设置
查看>>
spring-cloud:熔断监控Hystrix Dashboard和Turbine的示例
查看>>
Linux学习之CentOS(十二)--crontab命令的使用方法
查看>>
Linux几个命令
查看>>
Linux系统日志级别
查看>>
Web报表工具FineReport中JavaScript的使用
查看>>
EMC virtual provisining and fast vp
查看>>
win10 uwp 如何打包Nuget给其他人
查看>>
活动目录之用户配置文件(转载)
查看>>
Git 远程分支的pull与push
查看>>
mysql单用户赋予多库权限
查看>>
Tcpdump配合Tcpreplay回放实现网络探测
查看>>
mysql多实例安装脚本
查看>>
iOS开发UI篇—UIWindow简单介绍
查看>>