`

SQL Server中对已经定义的变量赋值的方式用两种,分别是 SET 和 SELECT

阅读更多
SQL Server中对已经定义的变量赋值的方式用两种,分别是 SET 和 SELECT。
对于这两种方式的区别,SQL Server 联机丛书中已经有详细的说明,但很多时候我们
并没有注意,其实这两种方式还是有很多差别的。
SQL Server推荐使用 SET 而不是 SELECT 对变量进行赋值。
当表达式返回一个值并对一个变量进行赋值时,推荐使用 SET 方法。
下表列出 SET 与 SELECT 的区别。请特别注意红色部分。

set
select

同时对多个变量同时赋值
不支持
支持

表达式返回多个值时
出错
将返回的最后一个值赋给变量

表达式未返回值
变量被赋null值
变量保持原值

下面以具体示例来说明问题:
create table chinadba1(
userid int ,
addr varchar(128) 
)
go
insert into chinadba1(userid,addr) values(1,'addr1')
insert into chinadba1(userid,addr) values(2,'addr2')
insert into chinadba1(userid,addr) values(3,'addr3')
go
表达式返回多个值时,使用 SET 赋值 
declare @addr varchar(128)
set @addr = (select addr from chinadba1)
/*
--出错信息为
服务器: 消息 512,级别 16,状态 1,行 2
子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
*/
go
表达式返回多个值时,使用 SELECT 赋值 declare @addr varchar(128)
select @addr = addr from chinadba1
print @addr --结果集中最后一个 addr 列的值
--结果: addr3 
go
表达式未返回值时,使用 SET 赋值 declare @addr varchar(128)
set @addr = '初始值'
set @addr = (select addr from chinadba1 where userid = 4 )
print @addr --null值 
go
表达式未返回值时,使用 SELECT 赋值 declare @addr varchar(128)
set @addr = '初始值'
select @addr = addr from chinadba1 where userid = 4
print @addr --保持原值
go
需要注意的是,SELECT 也可以将标量子查询的值赋给变量,如果标量子查询不返回值,则变量被置为 null 值。
此时与 使用 SET 赋值是完全相同的
对标量子查询的概念大家应该都觉得陌生,举个例子就能说明
declare @addr varchar(128)
set @addr = '初始值'
--select addr from chinadba1 where userid = 4 为标量子查询语句
select @addr = (select addr from chinadba1 where userid = 4) 
print @addr --null值

分享到:
评论

相关推荐

    SQL中SET和SELECT赋值的区别

    SQL 中的赋值操作是数据库编程中非常重要的一部分,SET 和 SELECT 是两种常用的赋值方式,但是它们之间存在着一些关键的区别。本文将详细介绍 SET 和 SELECT 赋值的区别,并讨论何时该使用哪个。 首先,需要注意的...

    SQL变量声明和赋值知识归纳

    ### SQL变量赋值 一旦变量被声明,就可以在代码中对其进行赋值。SQL提供了几种不同的方式来给变量赋值: 1. **使用SET语句**: ```sql SET @variable_name = value; ``` 这里,`value`可以是常量、表达式或另...

    sqlserver存储过程中SELECT 与 SET 对变量赋值的区别

    首先,SQL Server官方推荐在对单个变量赋值时使用`SET`,因为它的行为更加明确和一致。`SET`语句一次只能为一个变量赋值,而且如果表达式不返回任何值,变量将保持其原始值。这意味着,如果尝试用`SET`给变量赋一个...

    动态SQL 并且把返回的值赋给变量

    在SQL Server中,动态SQL是一种强大而灵活的工具,允许开发人员根据运行时条件构建并执行SQL查询。本文将详细介绍如何利用`sp_executesql`来执行动态SQL,并重点讨论如何将执行结果赋值给变量,以及一些重要的注意...

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

    在SQL Server中,`SELECT`和`SET`都是用于赋值的语句,但它们在具体操作和适用场景上存在一些差异。 1. **赋值规范性**:`SET`是按照ANSI SQL标准的方式来赋值,而`SELECT`则不是。这使得`SET`在某些情况下成为更...

    SQL-Server笔试题含答案

    正确答案是C:不能使用SELECT语句给变量赋值,因为可以使用SELECT语句给变量赋值。 13. 在SQL Server中,运行以下T-SQL语句,输出的结果是( )。 这个问题考察了SQL Server中的存储过程。正确答案是没有输出结果,...

    sqlserver 学习资料

    * 程序结束:使用GOT-SQL变量。 三、变量的作用域和默认值 变量的作用域是当前批处理,默认值为空值。 四、变量的赋值和显示 使用SET命令或SELECT命令可以赋值变量。使用SELECT命令可以显示变量数据。 五、...

    SQL Server存储过程基本语法

    在 SQL Server 中,我们可以使用 `DECLARE` 语句来定义变量,并通过 `SET` 或 `SELECT` 来给变量赋值。 ##### 1. 简单赋值 ```sql DECLARE @a int; SET @a = 5; PRINT @a; -- 使用 SET 语句进行赋值 ``` 这里声明了...

    Oracle与SQLServer的SQL语法差异总结1

    Oracle 和 SQL Server 是两种广泛使用的关系型数据库管理系统,尽管它们都支持 SQL 语句,但是它们之间存在一些语法差异。在本文中,我们将对 Oracle 和 SQL Server 的 SQL 语法差异进行总结。 存储过程 Oracle 中...

    SQL server 语句大全

    根据给定的文件标题、描述、标签以及部分内容,下面将...以上是对SQL Server中各种基本概念和操作的概述,这些知识点涵盖了SQL Server的核心功能和技术要点。掌握这些内容可以帮助您更好地管理和操作SQL Server数据库。

    oracle与SQL server的语法差异总结

    - SQL Server中,变量声明需要 `DECLARE @code VARCHAR(5)`,赋值使用 `SET @result = 'abcd'` 或 `SELECT @code = code, @name = name FROM sysc01 WHERE id = 1000`。 6. **语句结束符**: Oracle的SQL语句以...

    PostgreSQL_与_MS_SQLServer比较

    - **MS SQL Server** 中,变量定义使用 `DECLARE @variable AS type;` 语法,而赋值则通过 `SET @variable = value;` 或 `SELECT @variable = value;`。 - **PostgreSQL** 中,变量定义使用 `DECLARE variable type;...

    SQL中局部变量全局变量详解.doc

    Transact-SQL(T-SQL)作为Microsoft SQL Server的主要查询语言,支持两种类型的变量:局部变量和全局变量。这两种变量各有特点和应用场景,理解它们之间的区别对于编写高效、可靠的SQL脚本至关重要。 #### 二、...

    mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法

    MySQL存储过程是数据库中一种非常实用的功能,它允许开发者封装一系列SQL语句成一个可重复使用的单元,便于管理和执行复杂的数据库操作。本篇文章将详细探讨如何在MySQL中创建存储过程、调用存储过程以及声明和赋值...

    基于SQL中SET与SELECT赋值的区别详解

    最近的项目写的SQL比较多,经常会用到对变量赋值,而我使用SET和SELECT都会达到效果。那就有些迷惑,这两者有什么区别呢?什么时候哪该哪个呢?经过网上的查询,及个人练习,总结两者有以下几点主要区别:假定有设定...

    SQLServer与Oracle语法差异汇总.docx

    在IT行业中,数据库管理系统是核心组件之一,Oracle和SQL Server是两种广泛应用的关系型数据库系统。它们在语法上有诸多差异,这些差异主要体现在存储过程、自定义函数、游标、变量、赋值、语句结束符以及大小写敏感...

    oracle到sqlserver存储过程语法转换

    在数据库迁移项目中,从Oracle迁移到SQL Server是一种常见的场景。本文旨在提供一份详细的指南,帮助开发者更好地理解这两种数据库系统在存储过程方面的语法差异,并指导如何进行有效的转换。 #### 一、基本语法...

    个人SQLSERver总结

    SQLServer是微软公司推出的一种关系型数据库管理系统,广泛应用于数据存储和管理。下面是对SQLServer中涉及的一些核心知识点的详细解释: ### 数据库设计 在设计数据库时,我们需要遵循一定的步骤来确保数据的有效...

Global site tag (gtag.js) - Google Analytics