何時使用SET和SELECT為變數賦值

2021-09-06 21:39:47 字數 4065 閱讀 3508

原文:

何時使用set和select為變數賦值

我們經常使用set和select來為變數複製,但是有時候,只能選其一來使用,下面來看看這些例子,本例中使用adventureworks資料庫來做演示。

當你把查詢返回的值付給變數時,set將會接受這個結果(單值)並付給乙個標量值。但是select 可以接受查詢返回的多個值。

下面來看看單值和多值均使用set的例子:

use adventureworks

go-- 返回一行時使用set

declare @var1forset varchar(50)

set @var1forset = (select [name] from production.product where productnumber = 'hy-1023-70')

print @var1forset

gouse adventureworks

go-- 返回多行時使用set

declare @var2forset varchar(50)

set @var2forset = (select [name] from production.product where color = 'silver')

print @var2forset

go

可以看到如下結果:

當使用set作為多值賦值時,將會報錯。因為set拒絕乙個模糊的值(set不知道應該用哪個值來賦值)。

下面來看看用select來賦值的例子:

use adventureworks

go-- 通過select 來單值賦值

declare @var1forselect varchar(50)

set @var1forselect = (select [name] from production.product where productnumber = 'hy-1023-70')

print @var1forselect

go-- 通過select 來多值賦值

declare @var2forselect varchar(50)

select @var2forselect = [name] from production.product where color = 'silver'

print @var2forselect

go

可以看到均執行成功。

上面演示的例子,平時可以用作檢查問題之用。通過set來跟蹤一些錯誤。

當需要賦予多個變數值時,使用select 從乙個查詢中獲取資料是首選。因為可以直接賦值,而不用每次都寫set。可以看看下面的例子:

use adventureworks

go-- 直接賦值

declare @var1 varchar(50)

declare @var2 varchar(50)

declare @var3 varchar(50)

select @var1 = 'value1', @var2 = 'value2', @var3 = 'value3'

print @var1

print @var2

print @var3

go-- 通過查詢方式賦值

declare @name varchar(50)

declare @productno varchar(25)

declare @color varchar(15)

select @name = [name], @productno = productnumber, @color = color

from production.product

where productid = 320

print @name

print @productno

print @color

go

得到以下結果:

如果需要使用set,那必須使用多個單獨的語句來實現:

use adventureworks

go-- 直接賦值

declare @var1 varchar(50)

declare @var2 varchar(50)

declare @var3 varchar(50)

set @var1 = 'value1'

set @var2 = 'value2'

set @var3 = 'value3'

print @var1

print @var2

print @var3

go-- 通過查詢來賦值

declare @name varchar(50)

declare @productno varchar(25)

declare @color varchar(15)

set @name =(select [name] from production.product where productid = 320)

set @productno = (select productnumber from production.product where productid = 320)

set @color = (select color from production.product where productid = 320)

print @name

print @productno

print @color

go

得到結果:

通過對比可以明顯看出select 在多值賦值的情況下簡便很多,並且也高效,因為一次性實現。

當賦值失敗時,set和select 的行為是不一樣的。這裡的賦值失敗可能是沒有資料或者資料型別不配等。此時select會返回上乙個值(如果上乙個值已經賦值成功),而set會把null賦值給變數。不管如何,這種失敗的賦值都會產生不可預計的結果,所以需要細心處理。

下面來看看例子:

use adventureworks

go -- 展示set賦值失敗的情景

declare @var1 varchar(20)

set @var1 = 'value 1 assigned'

print @var1

set @var1 = (select color from production.product where productid = 32022)

print @var1

go-- 展示select賦值失敗的情景

declare @var1 varchar(20)

select @var1 = 'value 1 assigned'

print @var1

select @var1 = color from production.product where productid = 32023

print @var1

go

結果如下:

從結果中可以看出當set失敗時,返回null,而select失敗時會返回上乙個結果。

很多時候,使用select是乙個不錯的選擇,但是用select來賦值並不符合ansi標準,所以如果要遵循標準(可能因為要移植**到別的dbms),應該使用set來替代select 。

其實最好的方法還是通過實踐來證明。很多時候的確可以混用,但是有些時候還是建議單獨使用:

使用set的情景:

使用select的情景:

sql中 set 和select 的區別

sql server 中對已經定義的變數賦值的方式用兩種,分別是 set 和 select。對於這兩種方式的區別,sql server 聯機叢書中已經有詳細的說明,但很多時候我們 並沒有注意,其實這兩種方式還是有很多差別的。sql server推薦使用 set 而不是 select 對變數進行賦值。...

何時使用和不使用BBR

tcp bbr bottleneck bandwidth and round trip propagation time 是由google設計,並於2016年發布的擁塞演算法,以往大部分擁塞演算法是基於丟包來作為降低傳輸速率的訊號,而bbr基於模型主動探測。不過,在具體談論應該bbr合適的應用場景之...

何時使用引用和指標

但是,請等一下 你懷疑地問,這樣的 會產生什麼樣的後果?char pc 0 設定指標為空值 char rc pc 讓引用指向空值這是非常有害的,毫無疑問。結果將是不確定的 編譯器能產生一些輸出,導致任何事情都有可能發生 因為引用肯定會指向乙個物件,引用應被初始化。string rs 錯誤,引用必須被...