天天看點

何時使用SET和SELECT為變量指派

        我們經常使用SET和SELECT來為變量複制,但是有時候,隻能選其一來使用,下面來看看這些例子,本例中使用AdventureWorks資料庫來做示範。

       當你把查詢傳回的值付給變量時,SET将會接受這個結果(單值)并付給一個标量值。但是SELECT 可以接受查詢傳回的多個值。

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

可以看到如下結果:

何時使用SET和SELECT為變量指派

         當使用SET作為多值指派時,将會報錯。因為SET拒絕一個模糊的值(SET不知道應該用哪個值來指派)。

         下面來看看用SELECT來指派的例子:

可以看到均執行成功。

何時使用SET和SELECT為變量指派

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

         當需要賦予多個變量值時,使用SELECT 從一個查詢中擷取資料是首選。因為可以直接指派,而不用每次都寫SET。可以看看下面的例子:

得到以下結果:

何時使用SET和SELECT為變量指派

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

得到結果:

何時使用SET和SELECT為變量指派

通過對比可以明顯看出SELECT 在多值指派的情況下簡便很多,并且也高效,因為一次性實作。

      當指派失敗時,SET和SELECT 的行為是不一樣的。這裡的指派失敗可能是沒有資料或者資料類型不配等。此時SELECT會傳回上一個值(如果上一個值已經指派成功),而SET會把NULL指派給變量。不管如何,這種失敗的指派都會産生不可預計的結果,是以需要細心處理。

下面來看看例子:

結果如下:

何時使用SET和SELECT為變量指派

從結果中可以看出當SET失敗時,傳回NULL,而SELECT失敗時會傳回上一個結果。

很多時候,使用SELECT是一個不錯的選擇,但是用SELECT來指派并不符合ANSI标準,是以如果要遵循标準(可能因為要移植代碼到别的DBMS),應該使用SET來替代SELECT 。

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

         使用SET的情景:

  需要直接指派,且不需要任何查詢,比如變量初始化。

   故意賦予NULL值。

   為了将來的移植而遵循ANSI标準。

   賦予非标量值。

使用SELECT的情景:

  直接賦予多值變量。

  通過查詢來賦予變量(單值或多值均可)。

檢查編碼量。

為了擷取變量如@@ROWCOUNT和@@ERROR的值。