我們經常使用SET和SELECT來為變量複制,但是有時候,隻能選其一來使用,下面來看看這些例子,本例中使用AdventureWorks資料庫來做示範。
當你把查詢傳回的值付給變量時,SET将會接受這個結果(單值)并付給一個标量值。但是SELECT 可以接受查詢傳回的多個值。
下面來看看單值和多值均使用SET的例子:
可以看到如下結果:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuYmY4EWOlhTZ2Y2YkhDO5gDN0AjZ3UzM2cDZhRTYzETMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
當使用SET作為多值指派時,将會報錯。因為SET拒絕一個模糊的值(SET不知道應該用哪個值來指派)。
下面來看看用SELECT來指派的例子:
可以看到均執行成功。
上面示範的例子,平時可以用作檢查問題之用。通過SET來跟蹤一些錯誤。
當需要賦予多個變量值時,使用SELECT 從一個查詢中擷取資料是首選。因為可以直接指派,而不用每次都寫SET。可以看看下面的例子:
得到以下結果:
如果需要使用SET,那必須使用多個單獨的語句來實作:
得到結果:
通過對比可以明顯看出SELECT 在多值指派的情況下簡便很多,并且也高效,因為一次性實作。
當指派失敗時,SET和SELECT 的行為是不一樣的。這裡的指派失敗可能是沒有資料或者資料類型不配等。此時SELECT會傳回上一個值(如果上一個值已經指派成功),而SET會把NULL指派給變量。不管如何,這種失敗的指派都會産生不可預計的結果,是以需要細心處理。
下面來看看例子:
結果如下:
從結果中可以看出當SET失敗時,傳回NULL,而SELECT失敗時會傳回上一個結果。
很多時候,使用SELECT是一個不錯的選擇,但是用SELECT來指派并不符合ANSI标準,是以如果要遵循标準(可能因為要移植代碼到别的DBMS),應該使用SET來替代SELECT 。
其實最好的方法還是通過實踐來證明。很多時候的确可以混用,但是有些時候還是建議單獨使用:
使用SET的情景:
需要直接指派,且不需要任何查詢,比如變量初始化。
故意賦予NULL值。
為了将來的移植而遵循ANSI标準。
賦予非标量值。
使用SELECT的情景:
直接賦予多值變量。
通過查詢來賦予變量(單值或多值均可)。
檢查編碼量。
為了擷取變量如@@ROWCOUNT和@@ERROR的值。