前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >BI-SQL丨表变量与临时表

BI-SQL丨表变量与临时表

原创
作者头像
PowerBI丨白茶
发布2022-05-07 19:59:19
7480
发布2022-05-07 19:59:19
举报
文章被收录于专栏:PowerBI

表变量与临时表

白茶在之前描述WITH AS的用法时,曾提到过,除了WITH AS以外,我们还有其他两种办法来进行类似DAX中VAR定义虚拟表的行为,本期我们来了解一下:如何使用表变量与临时表。

表变量

特征:

1.表变量拥有特定的作用域且在批处理结束以后会被自动的清除;

2.表变量相较于临时表,会产生更少的存储过程重编译;

3.表变量的事务行为仅在更新数据时生效,因此锁和日志产生的数量较少;

4.表变量的作用域较小,不属于数据库持久的部分,因此事务的回滚不影响表变量。

表变量可以像正常的物理表一样使用,我们可以对其进行增删改查,但是在特定的语句中,我们需要注意。

注意事项:

1.表变量不能赋值给另一个变量;

2.Check约束、默认值和计算列不能引用自定义函数;

3.不能为约束命名;

4.不能使用Truncate命令清除表变量数据保留表结构;

5.不能向标识列中插入显式值;

6.注意局部变量前缀为@,全局变量为@@。

语法:

单个变量:

代码语言:txt
复制
DECLARE @变量名称 数据类型
SET @变量名称=值

表变量:

代码语言:txt
复制
DECLARE @变量表名称 TABLE
(列名称 数据类型,
列名称 数据类型,
...
)
INSERT INTO @变量表名称 VALUES(值,值,...)

使用实例:

例子1:生成单个变量

代码语言:txt
复制
DECLARE @BAICHA VARCHAR(255)
SET @BAICHA='白茶'
SELECT @BAICHA

结果如下:

例子2:生成表变量

代码语言:txt
复制
DECLARE @BAICHA TABLE
(Customer VARCHAR(255),
Quantity INT,
Age INT
)
INSERT INTO @BAICHA VALUES('白茶',10000,30)
SELECT * FROM @BAICHA

结果如下:

临时表

临时表与物理表的区别:

1.临时表的名称不能超过116字符;

2.局部临时表以"#"开头命名,作用域仅仅在当前连接内,会话结束后,会被自动删除,不可以被其他连接调用;

3.全局临时表以"##"开头命名,创建时对任何数据库连接都是可见的,当所有连接断开时,会自动进行删除;

4.不能对临时表进行分区;

5.不能对临时表加外键约束。

语法:

代码语言:txt
复制
CREATE TABLE #临时表名称(或##临时表名称)
(列名称 数据类型,
列名称 数据类型,
...
)
INSERT INTO #(或##)临时表名称 VALUES(值,值,...)

使用实例:

创建一个临时表。

代码语言:txt
复制
CREATE TABLE #BAICHA
(Customer VARCHAR(255),
Quantity INT,
Age INT
)
INSERT INTO #BAICHA VALUES('白茶',10000,30)
SELECT * FROM #BAICHA

结果如下:

认知误区:

Q:表变量仅仅存储在内存中,而临时表存储在物理介质中。

A:这两种观点都是错误的,只要内存足够,二者都会在内存中创建处理。也同样可以转入物理介质。

Q:表变量不能拥有索引。

A:这个也是错误的,当表变量创建后,对其添加索引的操作是不可以的,但是可以在定义表变量的时候直接定义索引。

最后是关于表变量和临时表的选择问题,严格来说我们在开发过程中并没有严格要求必须选择哪一种,这个可能需要小伙伴在使用过程中咨询相应的开发规范,如果没有的话,可酌情选择。

这里是白茶,一个PowerBI的初学者。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档