您现在的位置是:网站首页> 编程资料编程资料
sqlserver 临时表 Vs 表变量 详细介绍_MsSql_
                     2023-05-26
                411人已围观
                
                2023-05-26
                411人已围观
            
简介 sqlserver 临时表 Vs 表变量 详细介绍_MsSql_
例子描述
约束(Constraint)
在临时表和表变量,都可以创建Constraint。针对表变量,只有定义时能加Constraint。
e.g.在Microsoft SQL Server Management Studio(MSSMS)查询中,创建临时表并建Constraint场景,<脚本S1.>
Use tempdb
go
if object_id('Tempdb..#1') IsNotNull
DropTable #1
Go
CreateTable #1
(
ID int,
Nr nvarchar(50) notnull,
OperationTime datetime default (getdate()),
Constraint PK_#1_ID PrimaryKey (ID)
)
AlterTable #1 AddConstraint CK_#1_Nr Check(Nr Between'10001'And'19999')
Go
< 脚本S1.>中,可以看出在临时表#1的创建时,创建Constraint如“Constraint PK_#1_ID Primary Key(ID)”,也可以在创建临时表#1后创建Constraint,如“Alter Table #1 Add Constraint CK_#1_Nr Check(Nr Between '10001' And'19999')”,下面我们来看表变量的场景,在定义表变量时不能指定Constraint名,定义表变量后不能对表变量创建Constraint。
e.g. 在定义表变量时不能指定Constraint名<代码S2.>
Use tempdb
Go
Declare @1 Table
(
ID int,
Nr nvarchar(50) notnull,
OperationTime datetime default (getdate()),
Constraint [PK_@1_ID] PrimaryKey (ID)
)
在定义表变量后不能对表变量创建Constraint,<代码S3.>
use tempdb
go
Declare @1 Table
(
ID intprimarykeyclustered,
Nr nvarchar(50),
OperationTime datetime default (getdate())
)
AlterTable @1 AddConstraint [CK_@1_Nr] Check(Nr Between'10001'And'19999')

在<代码S2.>和<代码S3.>中可以发现,在解析T-SQL语法过程就发生错误,也就是SQL Server不支持定义表变量时对Constraint命名,也不支持定义表变量后,对其建Constraint。
这里慎重提示下,在<代码S1.>给临时表建Constraint的时候,特别是在并发场景中,不要指定具体的Constraint名称,不然会发生对象已存在的错误提示。
e.g. 在MSSMS中我们先执行之前<代码S1.>的创建临时表#1,不关闭当前会话的情况下,另建一个查询,执行与<代码S1.>相同的代码,如图
左边的查询窗口,是执行原先的<代码S1.>,右边的查询窗口,是后执行相同的<代码S1.>。在这里,我们注意红色圈圈部分,发现在创建临时表#1的过程,明确给了一个主键名称“PK_#1_ID”,当右边再创建相同临时表#1的时候就发生了对象重复错误问题。我们也可以通过SQL Server提供的系统视图sys.objects查询约束“PK_#1_ID”的信息,
use tempdb
go
Select * from sys.objects Where name='PK_#1_ID'
在系统视图sys.objects,发现“PK_#1_ID”名称后面不加如何的随机数值表述不同会话有不同的对象。根据SQL Server对sys.objects的描述规则,sys.objects中的Name列数据是唯一的。当另一个会话创建相同的对象时就会发生对象重复的错误。
在Constraint中,Foreign Key是不能应用与表变量,对于临时表,创建Foreign Key是没有意义的。也就是说临时表不受Foreign Key约束。下面我们通过例子来说明临时表的情况,
e.g.< 脚本S4.>
use tempdb
go
if object_id('Tempdb..#1') IsNotNull
DropTable #1
Go
if object_id('Tempdb..#2') IsNotNull
DropTable #2
Go
CreateTable #1
(
ID int,
Nr nvarchar(50) notnull,
OperationTime datetime default(getdate()),
Constraint PK_#1_ID PrimaryKey(ID)
)
AlterTable #1提示: 本文由神整理自网络,如有侵权请联系本站删除! 
本站声明:
1、本站所有资源均来源于互联网,不保证100%完整、不提供任何技术支持;
2、本站所发布的文章以及附件仅限用于学习和研究目的;不得将用于商业或者非法用途;否则由此产生的法律后果,本站概不负责!
点击排行
本栏推荐
 



 
                                
                                                         
                                
                                                         
                                
                                                         
    