最近的项目写的SQL比较多,经常会用到对变量赋值,而我使用SET和SELECT都会达到效果。

那就有些迷惑,这两者有什么区别呢?什么时候哪该哪个呢?

经过网上的查询,及个人练习,总结两者有以下几点主要区别:

假定有设定变量:

DECLARE @VAR1 VARCHAR(1)
DECLARE @VAR2 VARCHAR(2)

1、SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值,如下:

SELECT @VAR1='Y',@VAR2='N'
-- 而SET要达到同样的效果,需要:
SET @VAR1='Y'
SET @VAR2='N'

/*
说到这个,SQL内置的变量:@@ERROR 和 @@ROWCOUNT必须要在一句SQL语句中捕获。如果用set分两句来获取它们,将获取不完整,这时就应该用select来获取值。
*/

2、表达式返回多个值时,用SET将会出错,而SELECT将取最后一个值,如下:

----以下假定Permission表有多个IsRight记录
SELECT @VAR1 = IsRight FROM Permission   --将取最后一个值
 
SET @VAR1 = IsRight FROM Permission   --将报错

3、表达式无返回值时,用SET将置变量值为NULL,用SELECT交保持变量值,如下:

----以下假定Permission记录为空
SET @VAR1 = '初始值'
 
 
SELECT @VAR1 = IsRight FROM Permission   --此时@VAR1为'初始值'
 
SET  @VAR1 = (SELECT IsRight FROM Permission)   --此时@VAR1为NULL

4、使用标量子查询时,如果无返回值,SET和SELECT一样,都将置为NULL,如下:

----以下假定Permission记录为空
SET @VAR1 = '初始值'
 
SELECT @VAR1 =(SELECT IsRight FROM Permission )   --此时@VAR1为NULL
 
SET  @VAR1 = ( SELECT IsRight FROM Permission)   --此时@VAR1为NULL

附上两篇参考文章:

1、http://hi.baidu.com/lovebeast/blog/item/309fc95484581c52d10906b9.html

2、http://www.cnblogs.com/jiajinyi/archive/2009/02/17/1392420.html (着重提到了标量子查询)

FROM : http://www.cnblogs.com/McJeremy/archive/2011/03/30/1999508.html

SQL中SET和SELECT赋值的区别的更多相关文章

  1. sql 中set和select区别

    基于SQL中SET与SELECT赋值的区别详解 2012年09月06日 ⁄ 综合 ⁄ 共 912字 ⁄ 字号 小 中 大 ⁄ 评论关闭 最近的项目写的SQL比较多,经常会用到对变量赋值,而我使用SET ...

  2. 通过set赋值,与select赋值的区别

    ---通过set赋值,与select赋值的区别.declare @a int--set @a=(select count(*) from TblStudent)select @a=count(*) f ...

  3. SQL Server中 SET 和 SELECT 赋值有什么区别?

    SQL Server 中对已经定义的变量赋值的方式用两种,分别是 SET 和 SELECT.对于这两种方式的区别,SQL Server 联机丛书中已经有详细的说明,但很多时候我们并没有注意,其实这两种 ...

  4. sql server set赋值和select 赋值的区别以及使用方法

    sqlserver存储过程中SELECT 与 SET 对变量赋值的区别   (备注:虽然变量赋值使用方法已经不是问题,但是,了解一下select和set赋值的区别,还是提高了不少认识.应该有很多人并不 ...

  5. SQL中的Join和Where的区别

    一.sql语句中left join.inner join中的on与where的区别 0.各种join操作的概念和作用 left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. ...

  6. SQL中join和cross join的区别

    SQL中的连接可以分为内连接,外连接,以及交叉连接 . 1. 交叉连接CROSS JOIN 如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积: 举例, ...

  7. SQL中instr和like的使用区别

    1.instr函数 instr函数是一个字符串处理函数,它在Oracle/PLSQL中是返回子字符串在源字符串中的位置,如果在源串中没有找到子串,则返回0. instr函数定义如下: /* * 返回子 ...

  8. SQL中distinct 和 row_number() over() 的区别及用法

    1 前言 在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库中可能含有多条拥有相同名称的记录,从而在 ...

  9. SSM框架的sql中参数注入(#和$的区别)

    <select id="findUsersByUserName2" resultType="java.util.Map" parameterType=&q ...

随机推荐

  1. 【原】移动web页面兼容处理的思考

    本月收到一份关爱里程碑的邮件,入职满3周年了,从一个懵懂的新人到从容淡定的小油条,在外辛苦打工不容易,能收到一封简单的关怀邮件也是有感欣慰,这里祝愿公司越发展越好. 进入主题,移动网页设计中,很多同学 ...

  2. 并查集补集作法 codevs 1069 关押罪犯

    1069 关押罪犯 2010年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description ...

  3. 如何用ZBrush快速绘制身体

    Fisker老师用了5节课详细讲解了僵尸的头部制作过程,用了大量时间完善细节部分,在ZBrush3D图形绘制软件中雕刻模型就是这样,需要反复调整与修改,每一个细节都做到极致才是最理想的状态.头部雕刻好 ...

  4. Serial Port Programming using Win32 API(转载)

    In this tutorial we will learn How to communicate with an external device like a microcontroller boa ...

  5. 玩转Unity资源,对象和序列化(下)

    本文将从Unity编辑器和运行时两个角度出发,主要探讨以下两方面内容:Unity序列化系统内部细节以及Unity如何维护不同对象之间的强引用.另外还会讨论对象与资源的技术实现差别. 译注:除非特别说明 ...

  6. Gradle 10分钟上手指南

    java的源码构建工具,大致经历了 ant -> maven -> gradle 这个过程,每一次进步,都是在解决之前的工具所带来的问题,简单来说: 1. ant 功能虽然也很强大,但是过 ...

  7. 创意十足的web布局及交互设计

    富有灵感和创意的设计与一般设计的区别在于,它不那么容易被想到和实现,一旦它被实现,一个非常有趣并且迷人的网站就诞生了. 网站几乎每天都能见到,但是不是每一个网站你都会说“真希望我也能想到过!” 设计者 ...

  8. Winform程序Chrome内核 WebBrowser 控件

    准备工作 Chrome浏览器的内核不叫Chrome,而是Webkit,因此,我们只要找到Webkit的项目就好了. 1.下载WebKit的项目bin,网址如下: https://sourceforge ...

  9. Spring配置文件中别名的使用

    id是bean的唯一标识符号,若没有Id那么name为默认标识符号 如果配置了id又配置了name,那么name为别名,别名可以配置多个,这些别名用逗号.空格等隔开. 还可以通过<alias n ...

  10. java中Arraylist复制方法

    方法一: ArrayList<Integer> mycopy=new ArrayList<Integer>(); mycopy=(ArrayList<Integer> ...