`
tmartin
  • 浏览: 104474 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

阅读更多

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

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值
go

分享到:
评论

相关推荐

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

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

    SQL Server存储过程基本语法

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

    SQL中SET和SELECT赋值的区别

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

    oracle到sqlserver存储过程语法转换

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

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

    3. **局部变量与全局变量**:在SQL Server中,变量以`@`开头表示局部变量,只能在声明它的批处理或存储过程中访问;而全局变量由系统定义,以`@@`开头,用户不能声明全局变量。 ### SQL变量赋值 一旦变量被声明,...

    sql server2008轻松编写t-sql存储过程

    ### SQL Server 2008 轻松编写 T-SQL 存储过程 #### 一、引言 SQL Server 2008 是一款功能强大的数据库管理系统,它提供了多种工具来帮助开发者高效地进行数据库管理和开发工作。其中,T-SQL(Transact-SQL)是SQL...

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

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

    sql server 存储过程

    变量赋值不能使用普通的赋值语句,而是需要使用SELECT或SET命令,例如select @id='***'。全局变量是SQL Server系统内部使用的变量,其作用范围不限于单一程序,任何程序都可以使用。全局变量通常用于存储系统的配置...

    有返回值SQL Server存储过程的一个调用方法.pdf

    通过实例,阐述了调用有返回值的SQL Server存储过程中的方法、步骤和获取最大ID值的处理方法。 首先,调用有返回值的SQL Server存储过程可以提高Power Builder程序的运行效率和系统的易维护性和扩展性。这是因为...

    SQLSERVER存储过程基本语法.docx

    本文将从变量的定义和赋值、表、临时表、表变量、循环等方面介绍 SQL Server 存储过程的基本语法。 一、定义变量 在 SQL Server 中,可以使用 declare 语句定义变量。变量可以是整数、字符串、日期等数据类型。...

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

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

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

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

    SQL存储过程IN参数的解决办法

    此方法主要利用了SQL Server中的临时表来实现对多个输入参数的处理。具体步骤如下: 1. **定义变量**:首先定义了一个`nvarchar(200)`类型的变量`@sx`,并将其赋值为“原料,备件”。 ```sql declare @sx ...

    Sql Server 存储过程调用存储过程接收输出参数返回值

    在SQL Server中,存储过程是预编译的SQL语句集合,它们允许开发者封装一系列复杂的数据库操作,并且可以通过参数传递数据。本篇文章将详细讲解如何在SQL Server中调用一个存储过程并接收输出参数以及返回值。 首先...

    SQL-Server笔试题含答案

    总共包括13道笔试题,涵盖了SQL Server中的多对多映射关系、事务、视图、局部变量、存储过程、索引等知识点。 1. SQL Server中,下面的映射关系属于“多对多”的是( )。 这个问题考察了SQL Server中的关系类型。...

    PostgreSQL_与_MS_SQLServer比较

    ### PostgreSQL与MS SQL Server在过程语言中的差异 在数据库领域,PostgreSQL 和 MS SQL Server 都是非常受欢迎的关系型数据库管理系统。两者在很多方面都提供了强大的功能支持,但在具体实现细节上存在不少差异。...

Global site tag (gtag.js) - Google Analytics