
 SQL Server 中对已经定义的变量赋值的方式用两种,分别是 SET 和 SELECT。对于这两种方式的区别,SQL Server 联机丛书中已经有详细的说明,但很多时候我们并没有注意,其实这两种方式还是有很多差别的。
 SQL Server推荐使用 SET 而不是 SELECT 对变量进行赋值。
当表达式返回一个值并对一个变量进行赋值时,推荐使用 SET 方法。
下表列出 SET 与 SELECT 的区别。请特别注意红色部分。
	 
	|  代码如下 | 
	 | 
	 
	 
	| 
 /****************** 场景布置 ******************/ 
DROP TABLE # 
CREATE TABLE #(OrderId INT) 
INSERT #(OrderId) VALUES(1) 
INSERT #(OrderId) VALUES(2) 
 
/****************** 角色上场 ******************/ 
-----角色1: 
DECLARE @id INT  
SET @id=100 
SET @id=(SELECT ISNULL(OrderId,0) FROM # WHERE OrderId=1000000000) 
SELECT @id 
--结果为NULL, 因为不存在OrderId为1000000000的单号,所以为NULL 
-----角色2: 
DECLARE @id INT  
SET @id=100 
SELECT @id=ISNULL(OrderId,0) FROM # WHERE OrderId=1000000000 
SELECT @id 
--结果为100, 因为不存在OrderId为1000000000的单号,所以执行SELECT @id=...未能给@id赋值 
-----角色3: 
DECLARE @id INT  
SET @id=100 
SELECT @id=OrderId FROM #-- ORDER BY OrderId DESC 
SELECT @id 
--结果为2, 执行SELECT @id=...将返回结果的最后一个值给@id 
 | 
	 
	
实例
为说明其差别,建立一张数据表,插入几条数据
	 
	|  代码如下 | 
	 | 
	 
	 
	| 
  
create table tblStudent 
( 
id nvarchar(10) primary key, 
name nvarchar(21)not null, 
) 
insert into tblStudent(id,name) values('2008110101','张三'); 
insert into tblStudent(id,name) values('2008110102','李四'); 
insert into tblStudent(id,name) values('2008110103','李四'); 
 | 
	 
	
1.select可以同时给多个变量赋值,set只能给一个变量赋值
情况1:
	 
	|  代码如下 | 
	 | 
	 
	 
	| 
 declare @variable1 int,@variable2 int 
select @variable2=1,@variable2=2 
set @variable1=1,@variable2=2报错 
Msg 102, Level 15, State 1, Line 4 
Incorrect syntax near ','. 
 | 
	 
	
情况2:
declare @variable1 int,@variable2 int
set @variable2=1
set @variable2=2
select @variable1=1,@variable2=2 正常通过
Command(s) completed successfully
.
2.当返回值为多行时,select不会出错,set要报错
	 
	|  代码如下 | 
	 | 
	 
	 
	| 
 declare @id nvarchar(10) 
print 'set赋多返回值:' 
set @id=(select id from tblStudent1 where name='李四') 
print 'set后的值为:'+@id --由于姓名为李四的人有两个,所以用set赋值会报错 
print 'set赋多返回值:' 
select @id=id from tblStudent1 where name='李四' 
print 'set后的值为:'+@id --用select赋值则不会报错结 
 | 
	 
	
错误码中Subquery returned more than 1 value.(即子查询返回超过一个值)
3.当无返回值时,set不为变量赋值,select赋值为NULL
	 
	|  代码如下 | 
	 | 
	 
	 
	| 
 --使用set赋空返回值 
DECLARE @id varchar(10) 
SET @id = '无值' 
SET @id =  
( 
SELECT id 
FROM dbo.tblStudent 
WHERE id = '**********' 
) 
--使用set赋值时,当查询无返回值时就为变量赋值为NULL 
SELECT @id as setResult 
GO 
--使用select赋空返回值 
DECLARE @id varchar(10) 
SET @id = '无值' 
SELECT @id = name 
FROM dbo.tblStudent 
WHERE id = '**********' 
--使用select赋值时,当查询无返回值时就不为变量赋值,变量保持以前的值即'无值' 
SELECT @id as selectResult 
GO 
 |