SQL--<二> SQL SERVER临时表的使用

本文详细介绍了SQL Server中临时表的使用方法,包括本地和全局临时表的区别、创建及管理临时表的方法,并对比了临时表与表变量的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL SERVER临时表的使用

复制代码
  

-- 删除临时表#Tmp
create table #Tmp -- 创建临时表#Tmp
(
ID
int IDENTITY ( 1 , 1 ) not null , -- 创建列ID,并且每次新增一条记录就会加1
WokNo varchar ( 50 ),
primary key (ID) -- 定义ID为临时表#Tmp的主键
);
Select * from #Tmp -- 查询临时表的数据
truncate table #Tmp -- 清空临时表的所有数据和约束
相关例子:
Declare @Wokno Varchar ( 500 ) -- 用来记录职工号
Declare @Str NVarchar ( 4000 ) -- 用来存放查询语句
Declare @Count int -- 求出总记录数
Declare @i int
Set @i = 0
Select @Count = Count ( Distinct (Wokno)) from #Tmp
While @i < @Count
Begin
Set @Str = ' Select top 1 @Wokno = WokNo from #Tmp Where id not in (Select top ' + Str ( @i ) + ' id from #Tmp) '
Exec Sp_ExecuteSql @Str ,N ' @WokNo Varchar(500) OutPut ' , @WokNo Output
Select @WokNo , @i -- 一行一行把职工号显示出来
Set @i = @i + 1
End
复制代码

 

 

临时表
可以创建本地和全局临时表。本地临时表仅在当前会话中可见;全局临时表在所有会话中都可见。

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

SQL 语句使用 CREATE TABLE 语句中为 table_name 指定的名称引用临时表:

 

  
CREATE TABLE #MyTempTable (cola INT PRIMARY KEY )
INSERT INTO #MyTempTable VALUES ( 1 )

 

 

 

如果本地临时表由存储过程创建或由多个用户同时执行的应用程序创建,则 SQL Server 必须能够区分由不同用户创建的表。为此,SQL Server 在内部为每个本地临时表的表名追
加一个数字后缀。存储在 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 变量有以下优点:

·table 变量的行为类似于局部变量,有明确定义的作用域。该作用域为声明该变量的函数、存储过程或批处理。
在其作用域内,table 变量可像常规表那样使用。该变量可应用于 SELECT、INSERT、UPDATE 和 DELETE 语句中用到表或表的表达式的地方。但是,table 不能用在下列语句中:
  INSERT INTO table_variable EXEC 存储过程。
  SELECT select_list INTO table_variable 语句。
在定义 table 变量的函数、存储过程或批处理结束时,自动清除 table 变量。

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

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

·涉及表变量的事务只在表变量更新期间存在。这样就减少了表变量对锁定和记录资源的需求。

·不支持在表变量之间进行赋值操作。

  
  declare @t1 table (t1 int )
  
declare @t2 table (t2 int )
  
set @t1 = @t2 -- 错误

 

要将提供的XML结构转换成SQL Server的一张临时表,我们可以先使用T-SQL结合XML功能进行数据解析,然后创对应的数据库表并插入数据。 首先,我们需要解析XML字符串以获取每行的数据,通常可以使用 `FOR XML` 或 `XPATH` 来完成这个任务。但是考虑到 `FOR XML` 的特性更适合于生成XML输出而非直接处理内部数据,这里我们倾向于使用 T-SQL 内置的函数来解析数据。由于原句中包含 `<column>` 标签以及 `<empID>`、`<flowID>` 子标签,并且每个元素值之间用 `<` 和 `>` 分隔,这提示我们需要使用正则表达式或其他文本解析技术来提取需要的信息。 然而,标准的 SQL Server 并不具备内置的正则表达式支持,所以我们可能需要借助一些技巧或存储过程来简化这一过程。不过,对于上述的简单例子,假设我们已经通过某种方式成功地从XML中提取了所需的数据: ```sql -- 示例:假设我们已知提取出的数据为 (empID, flowID) DECLARE @xmlData NVARCHAR(MAX) = '<row><empID>001</empID><flowID>002</flowID></row><row><empID>003</empID><flowID>004</flowID></row>'; ``` 现在,我们可以立一个简单的临时表结构,并将提取到的数据插入其中。例如: ```sql CREATE TABLE #TempTable ( empID VARCHAR(5), flowID VARCHAR(5) ); INSERT INTO #TempTable (empID, flowID) SELECT empID.value('.', 'VARCHAR(5)'), flowID.value('.', 'VARCHAR(5)') FROM (SELECT value('.', @xmlData) AS xmlString FROM STRING_SPLIT(@xmlData)) x WITH (TABLOCK); ``` 在这个示例中: 1. 创了一个名为 `#TempTable` 的临时表,它有两列 `empID` 和 `flowID`,都是 VARCHAR 类型。 2. 使用了 `STRING_SPLIT` 函数将 XML 字符串按照特定规则分割为单独的字符串。 3. 使用 `x.value` 函数来提取 `<empID>` 和 `<flowID>` 中的实际值,并将其插入到临时表中。 最后,如果需要进一步操作或查询此临时表,则可以像操作其他常规表一样进行。 -
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值