原文:
何時使用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 錯誤,引用必須被...