我們知道在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語句最后返回了多行記錄,那么變量就為最后一行記錄的值。