SqlServer中使用Select語句給變量賦值的時候需要注意的一個問題


我們知道在SqlServer中可以用Select語句給變量賦值,比如如下語句就為int類型的變量@id賦值

 1 declare @id int=-1;
 2 
 3 select @id=id from 
 4 (
 5 select 1 as id
 6 union all 
 7 select 2 as id
 8 union all 
 9 select 3 as id
10 ) as t
11 
12 select @id

執行上面的代碼會顯示下面的查詢結果,結果顯示最后@id的值為3,那么意味着上面第3行的select語句每返回一行數據記錄,sqlserver就用id列為@id進行了一次賦值,而最后一行數據記錄id列為3,所以在第12行的查詢中最后查得@id為3

那么如果上面第3行的查詢語句一行結果都沒有返回,那么最終在12行的查詢中@id會是什么值呢?很多人可能會想到@id會為null。

接下來我們將上面的代碼稍作更改如下,我們在第3行的查詢中加入了where條件1<>1,這個條件是永遠都不會被滿足的始終為false,所以現在第3行的select語句一條記錄都不會返回

 1 declare @id int=-1;
 2 
 3 select @id=id from 
 4 (
 5 select 1 as id
 6 union all 
 7 select 2 as id
 8 union all 
 9 select 3 as id
10 ) as t
11 where 1<>1
12 
13 select @id

我們查看一下現在代碼的執行結果,我們發現結果並不為null而是-1,相當於第3行的select語句根被就沒有為@id賦值,原因也很簡單,因為前面我們說了第3行的select語句返回多少條記錄,就會為@id賦多少次值,現在它一行記錄都沒有返回,那么就不會為@id賦值,所以最終@id還是為初始值-1

 

現在我們再將代碼改為如下所示,將查詢結果sum后的聚合值賦值給變量@id

 1 declare @id int=-1;
 2 
 3 select @id=sum(id) from 
 4 (
 5 select 1 as id
 6 union all 
 7 select 2 as id
 8 union all 
 9 select 3 as id
10 ) as t
11 where 1<>1
12 
13 select @id

這一次的結果顯示@id為null了,原因也很簡單因為第3行的查詢最后只返回了一行為null記錄,所以對@id進行了一次賦值,所以最后在13行的查詢中@id顯示為null

 

所以在使用Select語句為sql變量賦值的時候,一定要清楚變量的值是取決於select語句的查詢結果,如果select語句最后一行數據都沒返回,那么select語句就不會為變量賦值。如果select語句最后返回了多行記錄,那么變量就為最后一行記錄的值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM