SQL中SET与SELECT赋值的区别

假定有设定变量:


DECLARE @VAR1 VARCHAR(1) 
DECLARE @VAR2 VARCHAR(2) 


1、SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值,如下:
SELECT @VAR1='Y',@VAR2='N'
-- 而SET要达到同样的效果,需要:
SET @VAR1='Y'
SET @VAR2='N'
/*
   说到这个,SQL内置的变量:@@ERROR 和 @@ROWCOUNT必须要在一句SQL语句中捕获。如果用set分两句来获取它们,将获取不完整,这时就应该用select来获取值。
*/


2、表达式返回多个值时,用SET将会出错,而SELECT将取最后一个值,如下:
----以下假定Permission表有多个IsRight记录 
SELECT @VAR1 = IsRight FROM Permission   --将取最后一个值 

SET @VAR1 = IsRight FROM Permission   --将报错 


3、表达式无返回值时,用SET将置变量值为NULL,用SELECT交保持变量值,如下:
----以下假定Permission记录为空 
SET @VAR1 = '初始值'

SELECT @VAR1 = IsRight FROM Permission   --此时@VAR1为'初始值' 

SET  @VAR1 = (SELECT IsRight FROM Permission)   --此时@VAR1为NULL 


4、使用标量子查询时,如果无返回值,SET和SELECT一样,都将置为NULL,如下:
----以下假定Permission记录为空 
SET @VAR1 = '初始值'

SELECT @VAR1 =(SELECT IsRight FROM Permission )   --此时@VAR1为NULL 

SET  @VAR1 = ( SELECT IsRight FROM Permission)   --此时@VAR1为NULL 

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------

T-SQL中的变量分为局部变量和全局变量,局部变量的使用也是先声明,再赋值。而全局变量由系统定义和维护,我们可以直接使用,但是一般不定义全局变量。

局部变量
在T-SQL中,局部变量的名称必须以标记@作为前缀。

Declaer  @variable_name  DataType

其中@variable_name为变量名  DataType为数据类型。

局部变量的赋值有两种方法:使用Set语句或Select语句。

set  @variable_name = value

Selecte  @variable_name = value

Ø  SET赋值语句一般用户赋给变量指定的数据变量

Ø  Select赋值语句一般用于表中查询数据,然后查询的记录多于一条,将把最后一条记录的值赋给变量
SQL中SET与SELECT赋值的区别

建议使用Set,原因是因为Set语句没有结果,占用资源少,因此,给一个变量赋值时,使用Set效率更高。

SQL中SET与SELECT赋值的区别

注意:SELECT 也可以将标量子查询的值赋给变量,如果标量子查询不返回值,则变量被置为 null 值(此时与使用 SET 赋值是完全相同的)。
对标量子查询的概念大家可能觉得陌生,下面举个例子说明下(对比上面绿色部分):

declare @name varchar(128)
set @name = 'SELECT初始值'
select @name =(select name from fuzhiTEST where id = 4 )
print @name --正确运行:显示NULL
GO
 

https://blog.csdn.net/xiaokui_wingfly/article/details/45228263