临时表和表变量

简介:

临时表

可以创建本地临时表和全局临时表。本地临时表仅在当前会话中可见,而全局临时表在所有会话中都可见。临时表不能分区。

本地临时表的名称前面有一个数字符号 (#table_name),而全局临时表的名称前面有两个数字符号 (##table_name)。

SQL 语句使用 CREATE TABLE 语句中为 table_name 指定的值引用临时表,例如:

复制代码
CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)
INSERT INTO #MyTempTable VALUES (1)

如果在单个存储过程或批处理中创建了多个临时表,则它们必须有不同的名称。

如果本地临时表由存储过程创建或由多个用户同时执行的应用程序创建,则数据库引擎 必须能够区分由不同用户创建的表。为此,数据库引擎 在内部为每个本地临时表的表名追加一个数字后缀。存储在 tempdb 的 sysobjects 表中的临时表,其全名由 CREATE TABLE 语句中指定的表名和系统生成的数字后缀组成。为了允许追加后缀,为本地临时表指定的 table_name 不能超过 116 个字符。

除非使用 DROP TABLE 显式删除临时表,否则临时表将在退出其作用域时由系统自动删除:

  • 当存储过程完成时,将自动删除在存储过程中创建的本地临时表。由创建表的存储过程执行的所有嵌套存储过程都可以引用此表。但调用创建此表的存储过程的进程无法引用此表。

  • 所有其他本地临时表在当前会话结束时都将被自动删除。

  • 全局临时表在创建此表的会话结束且其他所有任务停止对其引用时将被自动删除。任务与表之间的关联只在单个 Transact-SQL 语句的生存周期内保持。换言之,当创建全局临时表的会话结束时,最后一条引用此表的 Transact-SQL 语句完成后,将自动删除此表。

在存储过程或触发器中创建的本地临时表的名称可以与在调用存储过程或触发器之前创建的临时表名称相同。但是,如果查询引用临时表,而同时有两个同名的临时表,则不定义针对哪个表解析该查询。嵌套存储过程同样可以创建与调用它的存储过程所创建的临时表同名的临时表。但是,为了对其进行修改以解析为在嵌套过程中创建的表,此表必须与调用过程创建的表具有相同的结构和列名。下面的示例说明了这一点。

复制代码
CREATE PROCEDURE Test2
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (2)
SELECT Test2Col = x FROM #t;
GO
CREATE PROCEDURE Test1
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (1)
SELECT Test1Col = x FROM #t;
EXEC Test2;
GO
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (99);
GO
EXEC Test1;
GO

下面是结果集: 

复制代码
(1 row(s) affected)

Test1Col    
----------- 
1           

(1 row(s) affected)

Test2Col    
----------- 
2           

当创建本地或全局临时表时,CREATE TABLE 语法支持除 FOREIGN KEY 约束以外的其他所有约束定义。如果临时表中指定了 FOREIGN KEY 约束,则该语句将返回一条表明已跳过此约束的警告消息。此表仍将创建,但不使用 FOREIGN KEY 约束。在 FOREIGN KEY 约束中不能引用临时表。

建议您使用表变量而不使用临时表。当必须对临时表显式地创建索引时,或多个存储过程或函数必须使用表值时,临时表很有用。通常,表变量可提供更有效的查询处理。

表变量

一种特殊的数据类型,用于存储结果集以进行后续处理。table 主要用于临时存储一组行,这些行是作为表值函数的结果集返回的。

主题链接图标 Transact-SQL 语法约定

语法

table_type_definition ::= 
    TABLE ( { column_definition | table_constraint } [ ,...n ] ) column_definition ::= 
        column_namescalar_data_type 
    [ COLLATE collation_definition ] 
    [ [ DEFAULT constant_expression ] | IDENTITY [ ( seed , increment ) ] ] 
    [ ROWGUIDCOL ] 
    [ column_constraint ] [ ...n ] 

column_constraint ::= 
    { [ NULL | NOT NULL ] 
    | [ PRIMARY KEY | UNIQUE ] 
    | CHECK ( logical_expression ) 
    } 

table_constraint ::= 
     { { PRIMARY KEY | UNIQUE } ( column_name [ ,...n ] ) 
     | CHECK ( search_condition ) 
     } 

备注

可将函数和变量声明为 table 类型。table 变量可用于函数、存储过程和批处理中。

重要事项:
包含表变量的查询不会生成并行查询执行计划。特大型表变量或者复杂查询中的表变量可能会影响到性能。在这种情况下,请考虑改用临时表。有关详细信息,请参阅 CREATE TABLE (Transact-SQL)

 

 

Table 变量具有下列优点:

  • A. table 变量的行为类似于局部变量,有明确定义的作用域。这就是在其中声明该变量的函数、存储过程或批处理。 

    在其作用域内,table 变量可像常规表那样使用。该变量可应用于 SELECT、INSERT、UPDATE 和 DELETE 语句中用到表或表的表达式的任何地方。但是,table 不能用于以下语句中: 

    复制代码
    SELECT select_list INTO table_variable   
    在定义 table 变量的函数、存储过程或批处理结束时,会自动清除此变量。 

  • table 类型声明中的 CHECK 约束、DEFAULT 值和计算列不能调用用户定义函数。

  • 在存储过程中使用 table 变量与使用临时表相比,减少了存储过程的重新编译量。

  • 涉及 table 变量的事务只在 table 变量更新期间存在。因此减少了 table 变量对锁定和记录资源的需求。

不能显式创建表变量的索引,也不保留表变量的任何统计信息。在某些情况下,可以通过改用支持索引和统计信息的临时表来改善性能。有关临时表的详细信息,请参阅CREATE TABLE (Transact-SQL)

可以在批处理的 FROM 子句中按名称引用 table 变量,如下例所示:

复制代码
SELECT Employee_ID, Department_ID FROM @MyTableVar

在 FROM 子句外,必须使用别名来引用 table 变量,如下例所示:

复制代码
SELECT EmployeeID, DepartmentID 
FROM @MyTableVar m
JOIN Employee on (m.EmployeeID =Employee.EmployeeID AND
   m.DepartmentID = Employee.DepartmentID)

不支持在 table 变量之间进行赋值操作。另外,由于 table 变量作用域有限,并且不是持久数据库的一部分,因而不受事务回滚的影响。

参数

table_type_definition

与在 CREATE TABLE 中定义表时所用的信息子集相同的信息子集。表声明包括列定义、名称、数据类型和约束。允许的约束类型仅为 PRIMARY KEY、UNIQUE KEY 和 NULL。 

from:MSDN

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,转载请注明出处!
























本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sunshine-anycall/archive/2009/09/18/1568901.html ,如需转载请自行联系原作者



相关文章
|
JavaScript Java Maven
|
网络安全 Python
There was a problem confirming the ssl certificate
There was a problem confirming the ssl certificate
543 0
|
6月前
|
人工智能 自然语言处理 安全
基于LlamaIndex实现CodeAct Agent:代码执行工作流的技术架构与原理
CodeAct是一种先进的AI辅助系统范式,深度融合自然语言处理与代码执行能力。通过自定义代码执行代理,开发者可精准控制代码生成、执行及管理流程。本文基于LlamaIndex框架构建CodeAct Agent,解析其技术架构,包括代码执行环境、工作流定义系统、提示工程机制和状态管理系统。同时探讨安全性考量及应用场景,如软件开发、数据科学和教育领域。未来发展方向涵盖更精细的代码生成、多语言支持及更强的安全隔离机制,推动AI辅助编程边界拓展。
280 3
基于LlamaIndex实现CodeAct Agent:代码执行工作流的技术架构与原理
史上最简单给大模型注入新知识的方法(一)
史上最简单给大模型注入新知识的方法(一)
278 0
|
10月前
|
存储 对象存储 索引
对象存储OSS-m3u8视频私有权限
当上传至私有存储桶的M3U8视频缺少签名信息时,会导致播放失败(403错误)。解决方案是使用OSS的动态签名机制,在首次访问M3U8文件时,通过在URL中添加`x-oss-process=hls/sign`参数,OSS将自动对所有TS切片地址进行签名,确保视频正常播放。
571 2
|
12月前
|
消息中间件 存储 监控
说说如何解决RocketMq消息积压?为什么Kafka性能比RocketMq高?它们区别是什么?
【10月更文挑战第8天】在分布式系统中,消息队列扮演着至关重要的角色,它不仅能够解耦系统组件,还能提供异步处理、流量削峰和消息持久化等功能。在众多的消息队列产品中,RocketMQ和Kafka无疑是其中的佼佼者。本文将围绕如何解决RocketMQ消息积压、为什么Kafka性能比RocketMQ高以及它们之间的区别进行深入探讨。
448 1
|
缓存 Python
[译]Python 和 TOML:新最好的朋友 (2) 使用Python操作TOML
[译]Python 和 TOML:新最好的朋友 (2) 使用Python操作TOML
490 1
|
消息中间件 监控 负载均衡
rabbitmq与kafka的区别
RabbitMQ提供了强大的可靠性保障,通过持久化机制和消息确认机制来确保消息的可靠传输和消费。而Kafka也提供了类似的可靠性保障,但其持久化机制和消息确认机制的实现方式与RabbitMQ有所不同。
715 0
|
Linux
【专栏】Pigz 是一个并行化的 gzip 实现,利用多核处理器提高文件压缩速度
【4月更文挑战第28天】Pigz 是一个并行化的 gzip 实现,利用多核处理器提高文件压缩速度。相比 gzip,Pigz 在处理大型文件时更具优势,且生成的文件与 gzip 兼容。通过包管理器安装后,使用方式类似 gzip,支持高级选项。注意,Pigz 在压缩时会消耗更多系统资源,可能存在微小压缩差异,并需确保与其他工具的兼容性。在需要快速压缩的场景下,Pigz 是一个更好的选择。
851 0
|
搜索推荐 算法 前端开发
职位招聘管理与推荐系统Python+Django网页界面+协同过滤推荐算法
职位招聘管理与推荐系统Python+Django网页界面+协同过滤推荐算法
490 0