SQL SERVER中SELECT和SET赋值相同点与不同点(推荐)

 更新时间:2019年12月02日 09:27:04   作者:markkang  
SELECT和SET在SQL SERVER中都可以用来对变量进行赋值,但其用法和效果在一些细节上有些不同。今天小编给大家分享SQL SERVER中SELECT和SET赋值相同点与不同点,感兴趣的朋友一起看看吧

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赋值相同点与不同点,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

  • SQL Server 2016 TempDb里的显著提升

    SQL Server 2016 TempDb里的显著提升

    SQL Server 2016的最新CTP版本已经发布了:CTP 2.4(目前已经是CTP 3.0)。这个预览版相比以前的CTP包含了很多不同的提升,此篇文章给大家介绍SQL Server 2016 TempDb里的显著提升,小伙伴一起来了解了解吧
    2015-11-11
  • SQL中Merge用法详解

    SQL中Merge用法详解

    Merge关键字是一个神奇的DML关键字。它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句,本文给大家重点介绍sql中merge用法,需要的朋友一起了解下吧
    2015-09-09
  • SQL中的GREATEST函数从一组数据中找出最大值的解决方案

    SQL中的GREATEST函数从一组数据中找出最大值的解决方案

    SQL提供了一个强大的函数——GREATEST,可以轻松实现这一需求,下面详细讲述一下GREATEST函数的作用、用法、容易出现的问题以及解决方法,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • SQL按照日、周、月、年统计数据的方法分享

    SQL按照日、周、月、年统计数据的方法分享

    这篇文章主要为大家按日,星期,月,季度,年统计销售额的sql语句,需要的朋友可以参考下
    2013-10-10
  • SQL中的REGEXP正则表达式使用指南及语法详解

    SQL中的REGEXP正则表达式使用指南及语法详解

    SQL中的REGEXP正则表达式使用指南:基本语法、常用元字符、字符类、量词、常用转义字符、注意事项以及使用示例,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2025-01-01
  • 一个统计表每天的新增行数及新增存储空间的功能

    一个统计表每天的新增行数及新增存储空间的功能

    这篇文章主要介绍了一个统计表每天的新增行数及新增存储空间的功能,需要的朋友可以参考下
    2014-07-07
  • table 行转列的sql详解

    table 行转列的sql详解

    tabele行转列的资料,网上搜一下很多。大家照着网上copy就可以实现自己想要的功能。但是大家在实现功能后是否想过行转列为什么要这样写?下面就以一个实例来分析, 希望对初学者有所帮助。
    2009-06-06
  • 浅析SQL语句中GROUP BY的用法

    浅析SQL语句中GROUP BY的用法

    “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。
    2014-08-08
  • 深入浅析SQL封装、多态与重载

    深入浅析SQL封装、多态与重载

    这篇文章主要介绍了SQL封装、多态与重载的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • SQL学习笔记五去重,给新加字段赋值的方法

    SQL学习笔记五去重,给新加字段赋值的方法

    SQL学习笔记五去重,给新加字段赋值的方法,需要的朋友可以参考下。
    2011-08-08

最新评论