• SQL Server临时表、表标量和CTE


    在SQL Server中临时表、表变量和CTE通常用来存储临时表数据,这里简单介绍下它们间的不同和不同的应用场景。

    CTE

    CTE通常叫做“通用表达式”,在内存中创建。
    用途:通常用来替换需要递归的子查询。
    有效范围:只能在包含他CTE的语句中可使用。
    举例:有些复杂的查询语句中,子查询语句多次出现,这样代码显得冗长,且执行效率也不高:

    Select D.* From D
    Inner Join (
            Select id value, date From A
            Inner Join B on A.data < B.date
            Inner Join C on C.data > B.date
        ) CTE a c1 on c1.id = D.id+1
    Inner Join (
        Select id value, date From A
        Inner Join B on A.data < B.date
        Inner Join C on C.data > B.date
    ) as c2 on c2.id = D.id-1
    

    使用CTE替换子查询,将复杂的子查询结果保存,减少查询次数

    with CTE as (
        Select id value, date From A
        Inner Join B on A.data < B.date
        Inner Join C on C.data > B.date
    )
    Select D.* From D
    Inner Join CTE as c1 on c1.id = D.id+1
    Inner Join CTE as c2 on c2.id = D.id-1
    

    临时表

    在sql server中,临时表是在运行时创建的,您可以执行在“普通表”上可以执行的所有操作。这些表是在temdb数据库中创建的。根据作用域和行为,临时表分为两种类型,如下所示

    1. 本地临时表
      本地临时表只对创建表的SQL服务器会话(连接)可用,在连接关闭时自动删除。声明时以‘#’为前缀。
      注意这里的会话,数据库指:同一个打开的查询窗口;调用它的asp.net程序:一次sqlconnection连接(并不是指asp.net中的会话)。
      新建本地临时表并插入数据
    create Table #LocalTemp
    (
    	UserID int,
    	Name varchar(50),
    	Address varchar(150)
    )
    
    go
    insert into #LocalTemp values(1,'Shailendra','Noida')
    

    在当前窗口中指向查询
    select * from #LocalTemp;
    2. 全局临时表
    全局临时表可供所有SQL服务器会话或连接(即所有用户)使用。这些表可以由任何SQL服务器连接用户创建,当创建该临时表的连接关闭时会自动删除这些表。声明时以‘##’为前缀。
    新建全局临时表并插入数据

    create Table ##GlobalTemp
    (
    	UserID int,
    	Name varchar(50),
    	Address varchar(150)
    )
    
    go
    insert into ##GlobalTemp values(1,'Shailendra','Noida')
    

    另外打开一个新的窗口(或新换一用户连接)同样可正常查询
    select * from ##GlobalTemp;

    表变量

    这就像一个变量,并存在于特定的一批查询执行中。一旦它从批中出来,它就会被删除。这也是在temdb数据库中创建的,而不是内存。这也允许您在表变量声明时创建主键、标识,而不是非聚集索引。
    这里演示下它就像一个变量,可以当做参数传递到存储过程中
    声明一个表变量类型

    CREATE TYPE table_type_list AS TABLE 
    (
    	name varchar(50)
    )
    GO
    

    创建接收表变量的存储过程

    Create Proc test(
        @id int,
        @list table_type_list READONLY
    )
    as
    begin
        set nocount on
        select * from @list
    end
    

    声明表变量,并向表变量中插入数据,执行存储过程

    Declare @t table_type_list
    Insert into @t(name) values('a'), ('b'), ('c')
    Exec test 1, @t
    
  • 相关阅读:
    Golang使用os/exec时产生僵尸(defunct)进程
    golang channel 用法总结
    Git常用方法
    插入排序,冒泡排序,快速排序,选择排序,归并排序 C++代码实现
    Linux 系统安装golang
    Linux 压缩解压常用命令汇总
    云主机挂载硬盘
    Linux服务器如何修改内核版本号
    关于FreePBX语音网关对接遇到的伤心事
    Asterisk13.23.1如何增加G723编码和G729编码
  • 原文地址:https://www.cnblogs.com/LoveTomato/p/8535401.html
Copyright © 2020-2023  润新知