SELECT和SET在SQL SERVER中都可以用来对变量进行赋值,但其用法和效果在一些细节上有些不同。
1. 在对变量赋值方面,SET是ANSI标准的赋值方式,SELECT则不是。这也是SET方式被推荐使用的原因之一。
2. SELECT可以一次对多个变量进行赋值,而SET一次只能对一个变量赋值。
1
2
3
4
5
6
7
8
9
10
|
DECLARE @ NAME NVARCHAR(128), @AGE INT ;
SET @ NAME = N '小明' ;
SET @AGE=18;
PRINT @ NAME ;
PRINT @AGE;
GO
DECLARE @ NAME NVARCHAR(128), @AGE INT ;
SELECT @ NAME = N '小明' ,@AGE=18;
PRINT @ NAME ;
PRINT @AGE;
|
3.当使用子查询给变量赋值时,则要求子查询必须是标量子查询(即子查询得到结果是一个数据或者一行一列),不能返回多个值,否则会报错。
1)但要注意的是,如果在SELECT查询语句中给变量赋值的时候,查询语句返回记录的多少都不会产生错误,变量所得的值是查询语句最后一行的记录的相应值。
2)如果查询结果没有返回记录,也就是说返回为NULL值时,将整个子查询进行赋值的方式,SET和SELECT都会设置为NULL,而在SELECT查询语句中赋值,变量会保持为初始值不受影响。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
IF (OBJECT_ID( 'tempdb..#temp' ) is not null )
BEGIN
DROP TABLE # temp ;
END
ELSE
BEGIN
CREATE TABLE # temp (
[ Name ] NVARCHAR(128) ,
AGE INT
)
END
GO
INSERT INTO # temp ([ Name ],AGE) VALUES (N '小明' ,18)
INSERT INTO # temp ([ Name ],AGE) VALUES (N '小张' ,19)
INSERT INTO # temp ([ Name ],AGE) VALUES (N '小王' ,17)
GO
DECLARE @NAME1 NVARCHAR(128), @AGE1 INT ,@NAME2 NVARCHAR(128), @AGE2 INT ;
SET @NAME1=( SELECT TOP 1 [ NAME ] FROM # temp ); --SET标量在查询赋值
SELECT @AGE1=( SELECT TOP 1 AGE FROM # temp ); --SELECT标量在查询赋值
SELECT @NAME2=[ NAME ],@AGE2=[AGE] FROM # temp ; --SELECT查询语句中赋值
PRINT @NAME1; --正确运行,显示结果:小明
PRINT @AGE1; --正确运行,显示结果:18
PRINT @NAME2; --正确运行,显示结果:小王
PRINT @AGE2; --正确运行,显示结果:17
GO
DECLARE @NAME1 NVARCHAR(128), @AGE1 INT ,@NAME2 NVARCHAR(128), @AGE2 INT ;
SELECT @NAME1=N '初始名字' ,@AGE1=0,@NAME2=N '初始名字' ,@AGE2=0; --初始化各变量值
SET @NAME1=( SELECT TOP 1 [ NAME ] FROM # temp WHERE 1>1); --SET标量在查询赋值
SELECT @AGE1=( SELECT TOP 1 AGE FROM # temp WHERE 1>1); --SELECT标量在查询赋值
SELECT @NAME2=[ NAME ],@AGE2=[AGE] FROM # temp WHERE 1>1; --SELECT查询语句中赋值
PRINT @NAME1; --正确运行,实际值:NULL, 显示结果:(空白)
PRINT @AGE1; --正确运行,实际值:NULL, 显示结果:(空白)
PRINT @NAME2; --正确运行,实际和显示值:初始名字
PRINT @AGE2; --正确运行,实际和显示值:0
GO
|
那么我们该如何选择使用哪种方式:
1. 因SET作为ANSI的标准,因此其是推荐用法。
2. 在不考虑标准的情况下,如果涉及到对多个变量赋值,为了少写代码或者获取多个全局变量的值时,请考虑使用SELECT,一是因为简便,二是一些全局变量会在在第二句执行时值发生变化。
总结
以上所述是小编给大家介绍的SQL SERVER中SELECT和SET赋值相同点与不同点,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
原文链接:https://www.cnblogs.com/markkang/archive/2019/12/01/11965732.html