標籤:
我們知道在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 id10 ) as t11 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 id10 ) as t11 where 1<>112 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 id10 ) as t11 where 1<>112 13 select @id
這一次的結果顯示@id為null了,原因也很簡單因為第3行的查詢最後只返回了一行為null記錄,所以對@id進行了一次賦值,所以最後在13行的查詢中@id顯示為null
所以在使用Select語句為sql變數賦值的時候,一定要清楚變數的值是取決於select語句的查詢結果,如果select語句最後一行資料都沒返回,那麼select語句就不會為變數賦值。如果select語句最後返回了多行記錄,那麼變數就為最後一行記錄的值。
Sqlserver中使用Select語句給變數賦值的時候需要注意的一個問題