• SQLSERVER 中表变量与临时表


    SQL SERVER 中的变量表与临时表

    1.临时表

        临时表和永久表类似,很多永久表具有的功能特性,临时表都具有,临时表它的创建是在tempdb中,它只有在一个数据库连接结束后或者由sql命名drop掉,才消失,否则他会一直存在,临时表的创建的时候会产生sql server 系统日志,

    临时表分为两种:

                          一.以#开头的本地临时表,特点:只有在本地当前用户连接中才是可见的,当用户从实例中断开连接后自动被删除,

                          二.以##开头的全局临时表,特点:创建后,任何用户都可见,当所有用户断开连接后,被删除。

    --本地临时表的创建
    CREATE TABLE #LOCALTABLE
    (
     ID INT 
    )
    
    --全局临时表
    CREATE TABLE ##GOBAL(
    ID INT 
    )

    特别注意,存储过程中的临时表,在存储过程结束后,就会被自动删除(若果是嵌套在游标中的话,就不会删除)

    CREATE PROC PROC_A
    AS
    
       CREATE TABLE #SHOW(
        ID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
        VAL VARCHAR(100) 
       )
       
       INSERT INTO #SHOW VALUES('A')
       INSERT INTO #SHOW VALUES('B')
       INSERT INTO #SHOW VALUES('C')
       SELECT * FROM #SHOW
     
     GO
     
     EXEC PROC_A
     --当存储过程执行完毕之后,就自动的删除了; 若果是嵌套在游标中的话,就不会删除)
    SELECT * FROM #SHOW  --消息 208,级别 16,状态 0,第 1 行  对象名 '#SHOW' 无效。

    演示约束条件的添加

     --创建一个临时表
     CREATE TABLE #SHOW(
      ID INT NOT NULL,
      TITLE VARCHAR(100),
      CONTENT VARCHAR(300),
      DATETIMES DATETIME
     )
     
     --添加约束;
     ALTER TABLE #SHOW
     ADD
        CONSTRAINT CONSTRAINT_NAME DEFAULT(GETDATE()) FOR DATETIMES,
        PRIMARY KEY CLUSTERED(ID)
        GO
     

    临时表在创建之后可以修改许多已定义的选项,包括: 

      1添加、修改、删除列。例如,列的名称、长度、数据类型、精度、小数位数以及为空性均可进行修改,只是有一些限制而已。 

      2可添加或删除主键和外键约束。 

      3可添加或删除 UNIQUE 和 CHECK 约束及 DEFAULT 定义(对象)。 

      4可使用 IDENTITY 或 ROWGUIDCOL 属性添加或删除标识符列。虽然 ROWGUIDCOL 属性也可添加至现有列或从现有列删除,但是任何时候在表中只能有一列可具有该属性。 

      5)表及表中所选定的列已注册为全文索引。 

    2.表变量

           它的申明是使用DECLARE,表变量是变量的一种,表变量也分为本地及全局的两种,本地表变量的名称都是以“@”为前缀,只有在本地当前的用户连接中才可以访问。全局的表变量的名称都是以“@@”为前缀,一般都是系统的全局变量,像我们常用到的,如 @@Error代表错误的号,@@RowCount代表影响的行数。 

     DECLARE @LOCALTB TABLE
     (
       ID INT 
     )
     GO
     --全局
     DECLARE @@GOBAL TABLE
     (
       ID INT 
     )

          1.表变量是存储在内存中的,当用户在访问表变量的时候,SQL Server是不产生日志的,而在临时表中是产生日志的; 

      2.在表变量中,是不允许有非聚集索引的; 

      3.表变量是不允许有DEFAULT默认值,也不允许有约束; 

      4.临时表上的统计信息是健全而可靠的,但是表变量上的统计信息是不可靠的; 

      5.临时表中是有锁的机制,而表变量中就没有锁的机制。 

    总结:

            1使用表变量主要需要考虑的就是应用程序对内存的压力,如果代码的运行实例很多,就要特别注意内存变量对内存的消耗。我们对于较小的数据或者是通过计算出来的推荐使用表变量。如果数据的结果比较大,在代码中用于临时计算,在选取的时候没有什么分组的聚合,就可以考虑使用表变量。 

      2一般对于大的数据结果,或者因为统计出来的数据为了便于更好的优化,我们就推荐使用临时表,同时还可以创建索引,由于临时表是存放在Tempdb中,一般默认分配的空间很少,需要对tempdb进行调优,增大其存储的空间。

    ps:推荐一篇写的比较全的文章

    http://www.jb51.net/article/28788.htm

  • 相关阅读:
    算法导论--2.2分析算法
    C++对象模型
    算法导论--插入排序
    记一次Chrome冒充QQ浏览器领取奖励之行
    eclipse做界面开发
    eclipse jad 反编译 插件安装
    eclipse下web开发中缓存问题
    eclipse缓存问题
    No more “busy and acquire with NOWAIT”
    ora-00054:resource busy and acquire with nowait specified解决方法
  • 原文地址:https://www.cnblogs.com/mc67/p/4825208.html
Copyright © 2020-2023  润新知