SELECT和SET在SQL SERVER中都可以用来对变量进行赋值,但其用法和效果在一些细节上有些不同。

1. 在对变量赋值方面,SET是ANSI标准的赋值方式,SELECT则不是。这也是SET方式被推荐使用的原因之一。

2. SELECT可以一次对多个变量进行赋值,而SET一次只能对一个变量赋值。

DECLARE @NAME NVARCHAR(128), @AGE INT;
SET @NAME = N'小明';
SET @AGE=18;
PRINT @NAME;
PRINT @AGE;
GO
DECLARE @NAME NVARCHAR(128), @AGE INT;
SELECT @NAME = N'小明',@AGE=18;
PRINT @NAME;
PRINT @AGE;

3.当使用子查询给变量赋值时,则要求子查询必须是标量子查询(即子查询得到结果是一个数据或者一行一列),不能返回多个值,否则会报错。

1)但要注意的是,如果在SELECT查询语句中给变量赋值的时候,查询语句返回记录的多少都不会产生错误,变量所得的值是查询语句最后一行的记录的相应值。

2)如果查询结果没有返回记录,也就是说返回为NULL值时,将整个子查询进行赋值的方式,SET和SELECT都会设置为NULL,而在SELECT查询语句中赋值,变量会保持为初始值不受影响。

IF (OBJECT_ID('tempdb..#temp') is not null)
BEGIN
DROP TABLE #temp;
END
ELSE
BEGIN
CREATE TABLE #temp(
[Name] NVARCHAR(128) ,
AGE INT
)
END
GO
INSERT INTO #temp([Name],AGE) VALUES(N'小明',18)
INSERT INTO #temp([Name],AGE) VALUES(N'小张',19)
INSERT INTO #temp([Name],AGE) VALUES(N'小王',17)
GO
DECLARE @NAME1 NVARCHAR(128), @AGE1 INT,@NAME2 NVARCHAR(128), @AGE2 INT;
SET @NAME1=(SELECT TOP 1 [NAME] FROM #temp); --SET标量在查询赋值
SELECT @AGE1=(SELECT TOP 1 AGE FROM #temp); --SELECT标量在查询赋值
SELECT @NAME2=[NAME],@AGE2=[AGE] FROM #temp; --SELECT查询语句中赋值
PRINT @NAME1; --正确运行,显示结果:小明
PRINT @AGE1; --正确运行,显示结果:18
PRINT @NAME2; --正确运行,显示结果:小王
PRINT @AGE2; --正确运行,显示结果:17 GO DECLARE @NAME1 NVARCHAR(128), @AGE1 INT,@NAME2 NVARCHAR(128), @AGE2 INT;
SELECT @NAME1=N'初始名字',@AGE1=0,@NAME2=N'初始名字',@AGE2=0; --初始化各变量值
SET @NAME1=(SELECT TOP 1 [NAME] FROM #temp WHERE 1>1); --SET标量在查询赋值
SELECT @AGE1=(SELECT TOP 1 AGE FROM #temp WHERE 1>1); --SELECT标量在查询赋值
SELECT @NAME2=[NAME],@AGE2=[AGE] FROM #temp WHERE 1>1; --SELECT查询语句中赋值
PRINT @NAME1; --正确运行,实际值:NULL, 显示结果:(空白)
PRINT @AGE1; --正确运行,实际值:NULL, 显示结果:(空白)
PRINT @NAME2; --正确运行,实际和显示值:初始名字
PRINT @AGE2; --正确运行,实际和显示值:0
GO

那么我们该如何选择使用哪种方式:

1. 因SET作为ANSI的标准,因此其是推荐用法。

2. 在不考虑标准的情况下,如果涉及到对多个变量赋值,为了少写代码或者获取多个全局变量的值时,请考虑使用SELECT,一是因为简便,二是一些全局变量会在在第二句执行时值发生变化。

SQL SERVER中SELECT和SET赋值相同点与不同点的更多相关文章

  1. SQL Server中SELECT会真的阻塞SELECT吗?

    在SQL Server中,我们知道一个SELECT语句执行过程中只会申请一些意向共享锁(IS) 与共享锁(S), 例如我使用SQL Profile跟踪会话86执行SELECT * FROM dbo.T ...

  2. SQL Server 中SELECT INTO 和 INSERT INTO SELECT 两种表复制语句

    1.INSERT INTO SELECT语句 语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from Tab ...

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

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

  4. SQL SERVER中变量的定义、赋值与使用

      本文面向对SQL SERVER中变量操作不熟悉的用户,希望能使他们在看完本文后能对变量操作有具体和全面的认识.   在学习SQL SERVER的过程中,很多时候需要对某些单独的值进行调试,这时就需 ...

  5. SQL Server中行列转换 Pivot UnPivot

    SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...

  6. SQL Server中CURD语句的锁流程分析

    我只在数据库选项已开启“行版本控制的已提交读”(READ_COMMITTED_SNAPSHOT为ON)中进行了观察. 因此只适用于这种环境的数据库. 该类数据库支持四种不同事务隔离级别,下面分别观察数 ...

  7. ASP.NET用SQL Server中的数据来生成JSON字符串

    原文引自:  作者: 缺水的海豚  来源: 博客园  发布时间: 2010-09-21 21:47  阅读: 6136 次  推荐: 0   原文链接   [收藏] 摘要:ExtJs用到的数据内容基本 ...

  8. SQL Server中的查询

          本博文简介一下SQL Server中经常使用的几类查询及相关使用的方法.       一.ExecuteScalar方法获取单一值       ExecuteScalar方法是SqlCom ...

  9. SQL Server中关于基数估计如何计算预估行数的一些探讨

    关于SQL Server 2014中的基数估计,官方文档Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimat ...

随机推荐

  1. hexo博客yili主题个性化自定义教程(1) ——借鉴中学习,初认yili主题

    文章转载于:hexo博客yili主题个性化自定义教程(1) --借鉴中学习,初认yili主题 这个博客跌跌撞撞也弄了好多天了,由于Next主题不知道什么情况,被我玩坏了.所以换了一个主题. 大名鼎鼎的 ...

  2. Unity调用Android

    1.Unity调用Android 根据unity用户手册,unity可以采用native code(c/c++),但是也提供了C#调用方法,本文对此进行简单讲解. 2.Unity获取android类 ...

  3. 修改linux系统history命令的条数和格式

    在一次测试环境遇到的情况,发现服务莫名其妙挂了,以为服务有bug,查了一下午,后来一个同事说,是我把服务关了啊.... 是可忍孰不可忍,原生的history命令,只能看到输入的命令历史,看不到什么时候 ...

  4. django-URL之从URL中获取关键字(七)

    主要用于查询操作. 主要目录 book/views.py from django.http import HttpResponse from django.shortcuts import rende ...

  5. MySql逻辑结构简介

    结构示意图: 如上图,可把数据库的结构分成四层,见下图及文字说明  一.连接层提供客户端和连接服务,包含本地Sock通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信,主要完成一些类似于 ...

  6. Openmp多线程编程练习

    环境配置 一般使用Visual Studio2019来作为openmp的编程环境 调试-->属性-->C/C++-->所有选项-->Openmp支持改为 是(可以使用下拉菜单) ...

  7. python基础-流程控制(if,while,for)

    今日内容总结 --流程控制(if,while,for) if:用来判断事物的对错.真假.是否执行.根据不同的情况判断,条件满足执行某条件下的语句 语法结构(3种) # 第一种,只有if结构.条件表达式 ...

  8. 学习笔记33_EF跨数据库

    在App.Config中,可以: (1)自定义类 public xxxxDbContext() { public XXXXDbContext():base("name=xxxxContain ...

  9. Go服务监控

    使用Golang可以开发出高性能的HTTP.GRPC服务.一般项目运行后,我们也需要监控服务的性能或者进行调试.除了打日志,还有没有其他可视化的方案呢?答案是有的. 本文将会介绍几种常用的监控方案. ...

  10. Vim 自定义补全利器 Snippet

    Vim Snippet 设置 本人是 vim 用户,可以说能不用 IDE 就不用 IDE. Snippet 是一种支持用户自定义补全的需求,在 vim 中,可以使用 UltiSnips 和 Vim-S ...