BI-SQL丨表变量与临时表

表变量与临时表

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

表变量

特征:

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

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

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

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

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

注意事项:

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

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

3.不能为约束命名;

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

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

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

语法:

单个变量:

DECLARE @变量名称 数据类型
SET @变量名称=值

表变量:

DECLARE @变量表名称 TABLE
(列名称 数据类型,
列名称 数据类型,
...
)
INSERT INTO @变量表名称 VALUES(值,值,...)

使用实例:

例子1:生成单个变量

DECLARE @BAICHA VARCHAR(255)
SET @BAICHA='白茶'
SELECT @BAICHA

结果如下:

例子2:生成表变量

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.不能对临时表加外键约束。

语法:

CREATE TABLE #临时表名称(或##临时表名称)
(列名称 数据类型,
列名称 数据类型,
...
)
INSERT INTO #(或##)临时表名称 VALUES(值,值,...)

使用实例:

创建一个临时表。

CREATE TABLE #BAICHA
(Customer VARCHAR(255),
Quantity INT,
Age INT
)
INSERT INTO #BAICHA VALUES('白茶',10000,30)
SELECT * FROM #BAICHA

结果如下:

认知误区:

Q:表变量仅仅存储在内存中,而临时表存储在物理介质中。
A:这两种观点都是错误的,只要内存足够,二者都会在内存中创建处理。也同样可以转入物理介质。
Q:表变量不能拥有索引。
A:这个也是错误的,当表变量创建后,对其添加索引的操作是不可以的,但是可以在定义表变量的时候直接定义索引。

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fabric丨白茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值