SqlServer中使用Select语句给变量赋值的时候需要注意的一个问题

摘要:
许多人可能认为@id将为空。如果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
SqlServer中使用Select语句给变量赋值的时候需要注意的一个问题第1张

那么如果上面第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
SqlServer中使用Select语句给变量赋值的时候需要注意的一个问题第2张

现在我们再将代码改为如下所示,将查询结果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
SqlServer中使用Select语句给变量赋值的时候需要注意的一个问题第3张

所以在使用Select语句为sql变量赋值的时候,一定要清楚变量的值是取决于select语句的查询结果,如果select语句最后一行数据都没返回,那么select语句就不会为变量赋值。如果select语句最后返回了多行记录,那么变量就为最后一行记录的值。

免责声明:文章转载自《SqlServer中使用Select语句给变量赋值的时候需要注意的一个问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇aix ipcs使用说明使用OpenXml操作Excel,以下方法用于在添加列时修改Cell的CellReference属性。下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ROS(Robot Operating System)常用环境变量介绍

本文简单介绍ROS系统中常用的环境变量用途及设置方式。ROS系统环境中除了必须配置的环境变量以外,其他的也是十分有用,通过修改变量路径,可以设置ROS系统中log文件存放路径,单元测试结果存放路径等。 http://wiki.ros.org/ROS/EnvironmentVariables 一 、必选设置的环境变量 1、 ROS_ROOT 这个是ROS核心...

1.golang数据类型,转换,变量类型检查,生命周期、闭包,打印方法,指针简介

golang是强类型,静态语言 1.golang 数据类型 布尔类型 true/false var b bool ,在golang底层bool不是1/0表示的 数值类型 :var i int =3 / var i:=3 数字在计算机内部是以二进制的方式存储的,二进制位就是一系列布尔值,取值要么为1,要么为0. 1位表示1或0,对于4位整数可以表示16个不同...

Stata—描述性统计

1.资料的基本信息 ①summarize summarize:汇总所有变量的名称,个案数目,均值,标准差等,缩写为sum format age %6.2f:指定age变量的统计量输出时的保留2位小数 sum age, format:结合上个命令,对年龄变量进行描述的汇总保留2位小数 sum age,detail:汇总更加详细的信息 ②codebook co...

el-autocomplete select事件传递多个参数

转自:https://yuyuye958.github.io/2019/03/10/el-autocomplete/ 问题 <el-autocomplete v-model="state" :fetch-suggestions="querySearchAsync" placeholder="请输入内容" @select="handle...

oracle之数据限定与排序

数据限定与排序6.1 简单查询语句执行顺序from, where, group by, having, order by, selectwhere限定from后面的表或视图,限定的选项只能是表的列或列单行函数或列表达式,where后不可以直接使用分组函数SQL> select empno,job from emp where sal>2000;...

SQL数据库面试题

Database工程师面试 问题描述:为管理岗位业务培训信息,建立3个表:S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄C (C#,CN ) C#,CN 分别代表课程编号、课程名称SC ( S#,C#,G ) S#,C#,G 分别代表学号、所选修的课程编号、学习成绩要求实现如下5个处理:1. 使用标准SQ...