`
uule
  • 浏览: 6304620 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

【例子】表变量与临时表例子

 
阅读更多

表变量和临时表差不多,但是不会在临时库中存放。

与临时表相比,表变量具有下列优点:

表变量(如局部变量)具有明确定义的范围,在该范围结束时会自动清除这些表变量。 * 与临时表相比,表变量导致存储过程的重新编译更少。 * 涉及表变量的事务仅维持表变量上更新的持续时间。因此,使用表变量时,需要锁定和记录资源的情况更少。因为表变量具有有限的范围并且不是持久性数据库的一部分,所以事务回滚并不影响它们。

表变量例子

declare @t table(id int identity,col varchar(4))
declare @sql1 varchar(60)
declare @i int
declare @n int
set @sql1='吕布赵云马超典韦关羽张飞许褚黄忠颜良文丑庞德孙策'
set @i=1
set @n=2 --定义分段长度

while(@i<len(@sql1))
begin
    insert into @t select substring(@sql1,@i,@n)
    set @i=@i+@n
end

select * from @t

 结果:

 

 临时表例子:

--declare @t table(id int identity,col varchar(4))
create table #t(id int identity,col VARCHAR(4))
declare @sql1 varchar(60)
declare @i int
declare @n int
set @sql1='吕布赵云马超典韦关羽张飞'
set @i=1
set @n=2 --定义分段长度

while(@i<len(@sql1))
begin
    insert into #t select substring(@sql1,@i,@n)
    set @i=@i+@n
end

select * from #t
	  -- 结果:跟表对象结果相同
select * from #t for xml path('')
	  --结果:<id>1</id><col>吕布</col><id>2</id><col>赵云</col><id>3</id><col>马超</col><id>4</id><col>典韦</col><id>5</id><col>关羽</col><id>6</id><col>张飞</col>
select col from #t for xml path('')
	  --结果:<col>吕布</col><col>赵云</col><col>马超</col><col>典韦</col><col>关羽</col><col>张飞</col>
select col+',' from #t for xml path('')
	  --结果:吕布,赵云,马超,典韦,关羽,张飞,

 

 二、取父节点下所有子节点(包括子节点的子节点)

ALTER FUNCTION [dbo].[GetChildID]
( @ParentID int
)
returns @t table(ID int)
as
begin
   insert @t select ID from SYS_RESOURCE where SUP_ID = @ParentID
   while @@rowcount<>0
   begin
      insert @t select a.ID from SYS_RESOURCE a inner join @t b
      on a.SUP_ID =b.id and 
      not exists(select 1 from @t where id=a.id)
   end 
return
end

 

 三、表变量在存储过程中的运用

 

PROC
USE [xb_quotation_dev2]
GO

/****** Object:  StoredProcedure [dbo].[usp_UpdateTodayPriceMange]    Script Date: 02/18/2012 14:34:43 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[usp_UpdateTodayPriceMange] 
    @dt Ty_PublicTodayPrice READONLY
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @ERRORSMALL SMALLINT =0;
    BEGIN TRAN;
        SET @ERRORSMALL=-1;
        DECLARE @dt_Prices TABLE(AreaID INT NOT NULL ,GoodsId INT NOT NULL,GuidePrice DECIMAL(18,4) NOT NULL );
            WITH temp_1 AS(
                SELECT AreaID,GoodsId,GuidePrice FROM @dt
                UNION ALL
                SELECT a.AreaId,t.GoodsId,t.GuidePrice FROM MD_Area a INNER JOIN @dt t
                    ON a.QuotationType= t.AreaID 
                    AND EXISTS(SELECT 0 FROM MD_Goods g WHERE g.TypeId=a.GoodsTypeId AND g.ID= t.GoodsId)
            )
        INSERT INTO @dt_Prices SELECT AreaID,GoodsId,GuidePrice FROM temp_1;
            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
            AND CONVERT(VARCHAR(10),up.PriceDate,120)=CONVERT(VARCHAR(10),GETDATE(),120)
                IF(@@ERROR<>0) GOTO ERROR_Handler;
        SET @ERRORSMALL=-2;
            INSERT INTO MD_UpdatePrice(AreaID,GoodsId,GuidePrice, PriceDate) 
                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)    
                IF(@@ERROR<>0) GOTO ERROR_Handler;
        SET @ERRORSMALL=-3;
            UPDATE h SET h.GuidePrice=t.GuidePrice  FROM  MD_HistoryPrices h,@dt_Prices t WHERE  h.GoodsId = t.GoodsId
                 AND h.AreaID=t.AreaID AND CONVERT(VARCHAR(10),h.PriceDate,120)=CONVERT(VARCHAR(10),GETDATE(),120);
                IF(@@ERROR<>0) GOTO ERROR_Handler;
        SET @ERRORSMALL=-4;
            UPDATE p SET  p.GuidePrice=tt.GuidePrice  FROM MD_Prices p inner join @dt_Prices tt
                 on  P.GoodsId = tt.GoodsId AND
                 p.AreaID =tt.AreaID AND CONVERT(VARCHAR(10),p.PriceDate,120)=CONVERT(VARCHAR(10),GETDATE(),120);
        IF(@@ERROR<>0) GOTO ERROR_Handler;
    COMMIT TRAN;
    RETURN 0;
ERROR_Handler:
    ROLLBACK TRAN;
    RETURN @ERRORSMALL;
END

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,创建这个表值变量的语法是:

表值变量
USE [xb_quotation_dev2]
GO

CREATE TYPE [dbo].[Ty_PublicTodayPrice] AS TABLE(
    [AreaID] [int] NOT NULL,
    [GoodsId] [int] NOT NULL,
    [GuidePrice] [decimal](18, 4) NULL
)
GO

 

 

。。

 

 

  • 大小: 12.9 KB
分享到:
评论

相关推荐

    php获取一个变量的名字的方法

    PHP中,所有的变量都存储在”符号表”的HastTable结构中,符号的作用域是与活动符号表相关联的。因此,同一时间,只有一个活动符号表。 我们要获取到当前活动符号表可以通过 get_defined_vars 方法来获取。 get_...

    C#.net_经典编程例子400个

    55 实例052 为TextBox控件添加列表选择框 57 2.2 Button控件应用 58 实例053 在Button按钮中显示图标 58 2.3 ComboBox控件应用 59 实例054 将数据表中的字段添加到ComboBox控件 59 实例...

    PL/SQL 基础.doc

    表示变量具有与数据库的表中某一字段相同的类型 例:v_FirstName s_emp.first_name%TYPE; 3. RECORD类型 TYPE t_emp IS RECORD( /*其中TYPE,IS,RECORD为关键字,record_name为变量名称*/ field1 type [NOT...

    ORACLE11G宝典.rar 是光盘里面的内容,书太厚咧没法影印啊

     6.2.3 为用户设置表空间配额和临时表空间  6.3 创建表空间  6.3.1 创建(永久)表空间  6.3.2 创建大文件表空间  6.3.3 创建临时表空间  6.4 修改表空间  6.4.1 扩展表空间  6.4.2 修改属性、状态 ...

    Oracle8i_9i数据库基础

    §3.1.3 建立临时表结构 97 §3.3 修改表结构 98 §3.3.1 修改表结构命令 98 §3.3.2 修改表结构例子 99 §3.3.3 删除表结构 101 §3.3.4 使用CHECK作限制约束 101 §3.3.5 使用UNRECOVERABLE创建表 102 §3.3.6 将...

    编译原理全套

    7.3.2 临时名字的重新使用 7.3.3 数组元素的地址计算 7.3.4 数组元素地址计算的翻译方案 7.3.5 类型转换 7.4 布尔表达式和控制流语句 7.4.1 布尔表达式的翻译 7.4.2 控制流语句的翻译 7.4.3 布尔表达式的控制...

    数据库基础

    §3.1.3 建立临时表结构 97 §3.3 修改表结构 98 §3.3.1 修改表结构命令 98 §3.3.2 修改表结构例子 99 §3.3.3 删除表结构 101 §3.3.4 使用CHECK作限制约束 101 §3.3.5 使用UNRECOVERABLE创建表 102 §3.3.6 将...

    C语言解析教程(原书第4版)(美) 凯利.pdf

    5.4 例子:创建乘方表 5.5 从编译器的角度观察函数原型 5.6 函数定义顺序的另一种风格 5.7 函数调用和传值调用 5.8 开发大型程序 5.9 使用断言 5.10 作用域规则 5.10.1 平行和嵌套代码块 5.10.2 以调试为目的使用...

    数据库基础 ORACLE

    §3.1.3 建立临时表结构 97 §3.3 修改表结构 98 §3.3.1 修改表结构命令 98 §3.3.2 修改表结构例子 99 §3.3.3 删除表结构 100 §3.3.4 使用CHECK作限制约束 101 §3.3.5 使用UNRECOVERABLE创建表 102 §3.3.6 将...

    fetch-example:fetch()调用参议员的例子

    安装依赖项导入组件代码分割添加样式表后处理CSS 添加CSS预处理器(Sass,Less等) 添加图像,字体和文件使用public文件夹更改HTML 在模块系统之外添加资产何时使用public文件夹使用全局变量添加引导程序使用自定义...

    TCP_IP详解卷1

    21.2 超时与重传的简单例子 226 21.3 往返时间测量 227 21.4 往返时间RTT的例子 229 21.4.1 往返时间RTT的测量 229 21.4.2 RTT估计器的计算 231 21.4.3 慢启动 233 21.5 拥塞举例 233 21.6 拥塞避免算法 235 21.7 ...

    TCPIP详解卷[1].part04

    21.2 超时与重传的简单例子 226 21.3 往返时间测量 227 21.4 往返时间RTT的例子 229 21.4.1 往返时间RTT的测量 229 21.4.2 RTT估计器的计算 231 21.4.3 慢启动 233 21.5 拥塞举例 233 21.6 拥塞避免算法 235 21.7 ...

    TCPIP详解卷[1].part09

    21.2 超时与重传的简单例子 226 21.3 往返时间测量 227 21.4 往返时间RTT的例子 229 21.4.1 往返时间RTT的测量 229 21.4.2 RTT估计器的计算 231 21.4.3 慢启动 233 21.5 拥塞举例 233 21.6 拥塞避免算法 235 21.7 ...

    TCPIP详解卷[1].part03

    21.2 超时与重传的简单例子 226 21.3 往返时间测量 227 21.4 往返时间RTT的例子 229 21.4.1 往返时间RTT的测量 229 21.4.2 RTT估计器的计算 231 21.4.3 慢启动 233 21.5 拥塞举例 233 21.6 拥塞避免算法 235 21.7 ...

    TCPIP详解卷[1].part05

    21.2 超时与重传的简单例子 226 21.3 往返时间测量 227 21.4 往返时间RTT的例子 229 21.4.1 往返时间RTT的测量 229 21.4.2 RTT估计器的计算 231 21.4.3 慢启动 233 21.5 拥塞举例 233 21.6 拥塞避免算法 235 21.7 ...

    TCPIP详解卷[1].part06

    21.2 超时与重传的简单例子 226 21.3 往返时间测量 227 21.4 往返时间RTT的例子 229 21.4.1 往返时间RTT的测量 229 21.4.2 RTT估计器的计算 231 21.4.3 慢启动 233 21.5 拥塞举例 233 21.6 拥塞避免算法 235 21.7 ...

    TCP/IP详解part_2

    21.2 超时与重传的简单例子 226 21.3 往返时间测量 227 21.4 往返时间RTT的例子 229 21.4.1 往返时间RTT的测量 229 21.4.2 RTT估计器的计算 231 21.4.3 慢启动 233 21.5 拥塞举例 233 21.6 拥塞避免算法 235 21.7 ...

    TCPIP详解卷[1].part08

    21.2 超时与重传的简单例子 226 21.3 往返时间测量 227 21.4 往返时间RTT的例子 229 21.4.1 往返时间RTT的测量 229 21.4.2 RTT估计器的计算 231 21.4.3 慢启动 233 21.5 拥塞举例 233 21.6 拥塞避免算法 235 21.7 ...

    TCPIP详解卷[1].part11

    21.2 超时与重传的简单例子 226 21.3 往返时间测量 227 21.4 往返时间RTT的例子 229 21.4.1 往返时间RTT的测量 229 21.4.2 RTT估计器的计算 231 21.4.3 慢启动 233 21.5 拥塞举例 233 21.6 拥塞避免算法 235 21.7 ...

    TCPIP详解卷[1].part12

    21.2 超时与重传的简单例子 226 21.3 往返时间测量 227 21.4 往返时间RTT的例子 229 21.4.1 往返时间RTT的测量 229 21.4.2 RTT估计器的计算 231 21.4.3 慢启动 233 21.5 拥塞举例 233 21.6 拥塞避免算法 235 21.7 ...

Global site tag (gtag.js) - Google Analytics