下表列出 SET 與 SELECT 的區別
| SELECT | SET | |
| 同時對多個變量同時賦值時 | 支持 | 不支持 |
| 表達式返回多個值時 | 將返回的最后一個值賦給變量 | 出錯 |
| 表達式未返回值時 | 變量保持原值 | 變量被賦null值 |
(1).同時對多個變量同時賦值時
declare @a varchar(128), @b varchar(128)
SET @a='ABC',@b='EFG'
GO --報錯:消息 102,級別 15,狀態 1,第 3 行 ',' 附近有語法錯誤。
declare @a varchar(128), @b varchar(128)
SELECT @a='ABC',@b='EFG'
GO --正確運行
(2).表達式返回多個值時
在說明這一項前我們先創建一個要用到的表,並對其賦值,代碼如下:
賦值測試表--fuzhiTEST
create table fuzhiTEST( id int , name varchar(128) ) go insert into fuzhiTEST(id,name) values(1,'name1') insert into fuzhiTEST(id,name) values(2,'name2') insert into fuzhiTEST(id,name) values(3,'name3') go
declare @name varchar(128)
set @name = (select name from fuzhiTEST)
GO --報錯:消息 512,級別 16,狀態 1,第 2 行
子查詢返回的值不止一個。當子查詢跟隨在 =、!=、<、<=、>、>= 之后,或子查詢用作表達式時,這種情況是不允許的。
declare @name varchar(128)
select @name =name from fuzhiTEST
print @name
GO --正確運行:顯示 name3
(3).表達式未返回值時
declare @name varchar(128)
set @name = 'SET初始值'
set @name = (select name from fuzhiTEST where id = 4 )
print @name
GO --正確運行:顯示NULL
declare @name varchar(128)
set @name = 'SELECT初始值'
select @name = name from fuzhiTEST where id = 4
print @name --正確運行:顯示 SELECT初始值
GO
注意:SELECT 也可以將標量子查詢的值賦給變量,如果標量子查詢不返回值,則變量被置為 null 值(此時與使用 SET 賦值是完全相同的)。
對標量子查詢的概念大家可能覺得陌生,下面舉個例子說明下(對比上面綠色部分):
declare @name varchar(128)
set @name = 'SELECT初始值'
select @name =(select name from fuzhiTEST where id = 4 )
print @name --正確運行:顯示NULL
GO
