存儲過程中SELECT與SET對變量賦值的區別

 

SQL Server 中對已經定義的變量賦值的方式用兩種,分別是 SET SELECT。對於這兩種方式的區別,SQL Server 聯機叢書中已經有詳細的說明,但很多時候我們並沒有注意,其實這兩種方式還是有很多差別的。

SQL Server推薦使用 SET 而不是 SELECT 對變量進行賦值。當表達式返回一個值並對一個變量進行賦值時,推薦使用 SET 方法。

下表列出 SET SELECT 的區別。

 

set

select

同時對多個變量同時賦值

不支持

支持

表達式返回多個值時

出錯

將返回的最後一個值賦給變量

表達式未返回值

變量被賦null

變量保持原值

下面以具體示例來說明問題:

create table chinadba_a(
userid int ,
addr varchar(128)
)
go
insert into chinadba_a (userid,addr) values(1,'addr1')
insert into chinadba_a (userid,addr) values(2,'addr2')
insert into chinadba_a (userid,addr) values(3,'addr3')
go

表達式返回多個值時,使用 SET 賦值

declare @addr varchar(128)
set @addr = (select addr from chinadba_a)

/*
出錯信息爲,服務器: 消息 512,級別 16,狀態 1,行 2。子查詢返回的值多於一個。當子查詢跟隨在 =!=<<=>>= 之後,或子查詢用作表達式時,這種情況是不允許的。
*/
go

表達式返回多個值時,使用 SELECT 賦值

declare @addr varchar(128)
select @addr = addr from chinadba_a
print @addr --
結果集中最後一個 addr 列的值
--
結果: addr3
go

表達式未返回值時,使用 SET 賦值

declare @addr varchar(128)
set @addr = '
初始值'
set @addr = (select addr from chinadba_a where userid = 4 )
print @addr --null

go

表達式未返回值時,使用 SELECT 賦值

declare @addr varchar(128)
set @addr = '
初始值'
select @addr = addr from chinadba_a where userid = 4
print @addr --
保持原值
go

需要注意的是,SELECT 也可以將標量子查詢的值賦給變量,如果標量子查詢不返回值,則變量被置爲 null 值。此時與 使用 SET 賦值是完全相同的對標量子查詢的概念大家應該都覺得陌生,舉個例子就能說明

declare @addr varchar(128)
set @addr = '
初始值'
--select addr from chinadba_a where userid = 4
爲標量子查詢語句
select @addr = (select addr from chinadba_a where userid = 4)
print @addr --null

go

發佈了83 篇原創文章 · 獲贊 3 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章