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
分享到:
相关推荐
首先,SQL Server官方推荐在对单个变量赋值时使用`SET`,因为它的行为更加明确和一致。`SET`语句一次只能为一个变量赋值,而且如果表达式不返回任何值,变量将保持其原始值。这意味着,如果尝试用`SET`给变量赋一个...
在 SQL Server 中,我们可以使用 `DECLARE` 语句来定义变量,并通过 `SET` 或 `SELECT` 来给变量赋值。 ##### 1. 简单赋值 ```sql DECLARE @a int; SET @a = 5; PRINT @a; -- 使用 SET 语句进行赋值 ``` 这里声明了...
SQL 中 SET 和 SELECT 赋值的区别 SQL 中的赋值操作是数据库编程中非常重要的一部分,SET 和 SELECT 是两种常用的赋值方式,但是它们之间存在着一些关键的区别。本文将详细介绍 SET 和 SELECT 赋值的区别,并讨论...
### Oracle到SQL Server存储过程语法转换详解 在数据库迁移项目中,从Oracle迁移到SQL Server是一种常见的场景。本文旨在提供一份详细的指南,帮助开发者更好地理解这两种数据库系统在存储过程方面的语法差异,并...
3. **局部变量与全局变量**:在SQL Server中,变量以`@`开头表示局部变量,只能在声明它的批处理或存储过程中访问;而全局变量由系统定义,以`@@`开头,用户不能声明全局变量。 ### SQL变量赋值 一旦变量被声明,...
### SQL Server 2008 轻松编写 T-SQL 存储过程 #### 一、引言 SQL Server 2008 是一款功能强大的数据库管理系统,它提供了多种工具来帮助开发者高效地进行数据库管理和开发工作。其中,T-SQL(Transact-SQL)是SQL...
MySQL存储过程是数据库中一种非常实用的功能,它允许开发者封装一系列SQL语句成一个可重复使用的单元,便于管理和执行复杂的数据库操作。本篇文章将详细探讨如何在MySQL中创建存储过程、调用存储过程以及声明和赋值...
变量赋值不能使用普通的赋值语句,而是需要使用SELECT或SET命令,例如select @id='***'。全局变量是SQL Server系统内部使用的变量,其作用范围不限于单一程序,任何程序都可以使用。全局变量通常用于存储系统的配置...
通过实例,阐述了调用有返回值的SQL Server存储过程中的方法、步骤和获取最大ID值的处理方法。 首先,调用有返回值的SQL Server存储过程可以提高Power Builder程序的运行效率和系统的易维护性和扩展性。这是因为...
本文将从变量的定义和赋值、表、临时表、表变量、循环等方面介绍 SQL Server 存储过程的基本语法。 一、定义变量 在 SQL Server 中,可以使用 declare 语句定义变量。变量可以是整数、字符串、日期等数据类型。...
在SQL Server中,动态SQL是一种强大而灵活的工具,允许开发人员根据运行时条件构建并执行SQL查询。本文将详细介绍如何利用`sp_executesql`来执行动态SQL,并重点讨论如何将执行结果赋值给变量,以及一些重要的注意...
在SQL Server中,`SELECT`和`SET`都是用于赋值的语句,但它们在具体操作和适用场景上存在一些差异。 1. **赋值规范性**:`SET`是按照ANSI SQL标准的方式来赋值,而`SELECT`则不是。这使得`SET`在某些情况下成为更...
此方法主要利用了SQL Server中的临时表来实现对多个输入参数的处理。具体步骤如下: 1. **定义变量**:首先定义了一个`nvarchar(200)`类型的变量`@sx`,并将其赋值为“原料,备件”。 ```sql declare @sx ...
在SQL Server中,存储过程是预编译的SQL语句集合,它们允许开发者封装一系列复杂的数据库操作,并且可以通过参数传递数据。本篇文章将详细讲解如何在SQL Server中调用一个存储过程并接收输出参数以及返回值。 首先...
总共包括13道笔试题,涵盖了SQL Server中的多对多映射关系、事务、视图、局部变量、存储过程、索引等知识点。 1. SQL Server中,下面的映射关系属于“多对多”的是( )。 这个问题考察了SQL Server中的关系类型。...
### PostgreSQL与MS SQL Server在过程语言中的差异 在数据库领域,PostgreSQL 和 MS SQL Server 都是非常受欢迎的关系型数据库管理系统。两者在很多方面都提供了强大的功能支持,但在具体实现细节上存在不少差异。...