MSSQL(Sql Server)SELECT的迷惑性,使用SELECT赋值时要注意的一个问题
例:
DECLARE @id INT SELECT @id=id FROM tab WHERE id=1 IF(@id IS NULL) PRINT('NULL') ELSE PRINT('NOT NULL')
如果表中不存在id=1的数据,会打印出NULL,这并不是因为表中不存在那条数据的缘故,而是DECLARE一个变量,没给此变量赋值的话,默认是NULL,SELECT并没有给@id赋值。
所以:
DECLARE @id INT SET @id=-1 SELECT @id=id FROM tab WHERE id=1 IF(@id IS NULL) PRINT('NULL') ELSE PRINT('NOT NULL')
如果表中不存在id=1的数据,此时@id的值为-1,打印出NOT NULL,
使用SELECT为变量赋值,当没有返回值时,得到的是变量的上一个值。危险性在于SELECT赋值的迷惑性,不知道原理或者不注意时容易出问题。
如有以下代码,使用多个SELECT赋值时更具迷惑性。
DECLARE @id INT SELECT @id=id FROM tab WHERE id=1 --其它代码... SELECT @id=id FROM tab WHERE id=2 --其它代码... SELECT @id=id FROM tab WHERE id=3 --其它代码... --这时用@id做判断,就容易出问题,当表中有都有值时还好,得到的是最后一个值,当有的有值,有的没值时,得到的就不知道哪个值了。
所以为了防止意外出现,SELECT赋值用完之后一定要给那些变量再设一个默认值。