我们知道在SqlServer中可以用Select语句给变量赋值,比如如下语句就为int类型的变量@id赋值

 declare @id int=-1;

 select @id=id from
(
select 1 as id
union all
select 2 as id
union all
select 3 as id
) as t 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语句一条记录都不会返回

 declare @id int=-1;

 select @id=id from
(
select 1 as id
union all
select 2 as id
union all
select 3 as id
) as t
where 1<>1 select @id

我们查看一下现在代码的执行结果,我们发现结果并不为null而是-1,相当于第3行的select语句根被就没有为@id赋值,原因也很简单,因为前面我们说了第3行的select语句返回多少条记录,就会为@id赋多少次值,现在它一行记录都没有返回,那么就不会为@id赋值,所以最终@id还是为初始值-1

现在我们再将代码改为如下所示,将查询结果sum后的聚合值赋值给变量@id

 declare @id int=-1;

 select @id=sum(id) from
(
select 1 as id
union all
select 2 as id
union all
select 3 as id
) as t
where 1<>1 select @id

这一次的结果显示@id为null了,原因也很简单因为第3行的查询最后只返回了一行为null记录,所以对@id进行了一次赋值,所以最后在13行的查询中@id显示为null

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

SqlServer中使用Select语句给变量赋值的时候需要注意的一个问题的更多相关文章

  1. MySQL存储过程中使用SELECT …INTO语句为变量赋值

    使用SELECT …INTO语句为变量赋值 在MySQL存储过程中,可以使用SELECT …INTO语句对变量进行赋值,该语句在数据库中进行查询,并将得到的结果赋值给变量.SELECT …INTO语句 ...

  2. 【转载】 Sqlserver中通过Select Into语句快速单表备份

    在Sqlserver数据库中,备份数据的方式有很多种,可以使用整个数据库备份,也可使用导出包含数据和架构的脚本文件的方式来进行单表或多表数据的备份,其实还有一种Select Into的方式可以快速备份 ...

  3. Mysql训练:两个表中使用 Select 语句会导致产生 笛卡尔乘积 ,两个表的前后顺序决定查询之后的表顺序

    力扣:超过经理收入的员工 Employee 表包含所有员工,他们的经理也属于员工.每个员工都有一个 Id,此外还有一列对应员工的经理的 Id. +----+-------+--------+----- ...

  4. oracle数据库存储过程中的select语句的位置

    导读:在oracle数据库存储过程中如果用了select语句,要么使用"select into 变量"语句要么使用游标,oracle不支持单独的select语句. 先看下这个存储过 ...

  5. Sqlite和Mysql和SqlServer中insert … select … where not exist的用法

    下面介绍Mysql和Sqlite和Sqlserver中,根据select的条件判断是否插入.例如: 一.Mysql中: INSERT INTO books (name) SELECT 'SongXin ...

  6. SpringBoot 中使用 @Value 为 static 变量赋值

    原文:https://www.jianshu.com/p/ea477fc9abf7 例如: public class Utils { @Value("${test.host}") ...

  7. Java中简单的操作(if语句、常用操作符、switch语句、变量赋值等)

    ---------------------if语句介绍--------------------------------------------------- class IfDemo { public ...

  8. Insert插入语句中带有select语句

    我们有时候在写Insert语句的时候会遇到values里面的个别列的值需要从别的表中查询获取,这时候SQL语句需要使用向表中插入多条数据的写法: INSERT INTO LoginRecordInfo ...

  9. SQL Server 中VARCHAR(MAX)变量赋值引起的性能问题。

    案例环境: 操作系统版本 : Windows Server 2008 R2 Standard  SP1 数据库版本   :  Microsoft SQL Server 2012 (SP1) - 11. ...

随机推荐

  1. C#中static静态变量的用法

    使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员static修饰符可用于类.字段.方法.属性.运算符.事件和构造函数,但不能用于索引器.析构函数或类以外的类型 静态全局变量 定义 ...

  2. WPF基础知识、界面布局及控件Binding

    WPF是和WinForm对应的,而其核心是数据驱动事件,在开发中显示的是UI界面和逻辑关系相分离的一种开放语言.UI界面是在XAML语言环境下开发人员可以进行一些自主设计的前台界面,逻辑关系还是基于c ...

  3. laravel-v4.0.9

  4. OC面向对象—多态

    OC面向对象—多态 一.基本概念 多态是基于继承的基础之上的,多态可以使得父类的指针指向子类的对象.如果函数或参数中使用的是父类类型,可以传入父类.子类对象,但是父类类型的变量不能直接调用子类特有的方 ...

  5. Objective-C中 Self和 Super详解

    Objective-C中 Self和 Super详解 Objective-C 中Self 和 Super 详解本文要介绍的内容,在 Objective-C 中的类实现中经常看到这两个关键字 self  ...

  6. linux的5个查找命令_转

    转自:http://www.ruanyifeng.com/blog/2009/10/5_ways_to_search_for_files_using_the_terminal.html 在Linux中 ...

  7. Hello,HTML 到 HTML5

    HTML5是WEB应用将发展到一个水平必要的技术. 下面是WEB发展的时间轴: 1991 - HTML 1994 - HTML2 1996 - CSS1 + JAVASCRIPT 1997 - HTM ...

  8. 如何查看lib文件的导出函数

    参考:http://blog.csdn.net/brioxu/article/details/6932350 dumpbin /exports /out:xxx.dmp xxx.lib

  9. iOS 对UIButton的imageView和titleLabel进行重新布局

    #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...

  10. iOS 在一个应用程序中调另一个应用程序

    在A应用程序中调用B应用程序 1. 首先在B应用程序中生成URL 1)点击targets文件 2)点击Info 3)生成URL ①在Info.plist文件中点击+(新添加一项) ②在Info.pli ...