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`给变量赋一个...
如果需要对多个变量赋值,需要使用多个 SET 语句。SELECT 则不同,它可以在一条语句中对多个变量同时赋值。 例如,假定有两个变量 @VAR1 和 @VAR2,使用 SELECT 可以这样赋值: SELECT @VAR1='Y',@VAR2='N' 而...
3. **局部变量与全局变量**:在SQL Server中,变量以`@`开头表示局部变量,只能在声明它的批处理或存储过程中访问;而全局变量由系统定义,以`@@`开头,用户不能声明全局变量。 ### SQL变量赋值 一旦变量被声明,...
MySQL存储过程是数据库中一种非常实用的功能,它允许开发者封装一系列SQL语句成一个可重复使用的单元,便于管理和执行复杂的数据库操作。本篇文章将详细探讨如何在MySQL中创建存储过程、调用存储过程以及声明和赋值...
本文将详细介绍如何利用`sp_executesql`来执行动态SQL,并重点讨论如何将执行结果赋值给变量,以及一些重要的注意事项。 #### 动态SQL与`sp_executesql` 动态SQL是指在运行时构建的SQL语句,这种类型的SQL可以在不...
最近的项目写的SQL比较多,经常会用到对变量赋值,而我使用SET和SELECT都会达到效果。那就有些迷惑,这两者有什么区别呢?什么时候哪该哪个呢?经过网上的查询,及个人练习,总结两者有以下几点主要区别:假定有设定...
在 SQL Server 中,我们可以使用 `DECLARE` 语句来定义变量,并通过 `SET` 或 `SELECT` 来给变量赋值。 ##### 1. 简单赋值 ```sql DECLARE @a int; SET @a = 5; PRINT @a; -- 使用 SET 语句进行赋值 ``` 这里声明了...
综上所述,了解`SELECT`和`SET`的区别有助于在编写SQL Server脚本时做出合适的选择。在实际应用中,应根据具体情况、性能需求和标准规范来决定使用哪种赋值方式。记得在开发过程中,始终确保代码的可读性和维护性,...
SQL存储过程是数据库管理系统中一组为了完成特定功能的SQL语句集合,封装成一个可重复使用的对象。在本文中,我们将深入探讨SQL存储过程的基础语法,这对于初学者来说是非常有用的。 1. **注释** SQL支持两种类型...
1. **直接赋值**:使用`SET`语句来给变量赋值。它可以是常量、表达式,甚至可以是其他变量的值。例如: ```sql SET last = DATE_SUB(CURDATE(), INTERVAL 1 MONTH); ``` 2. **查询赋值**:当查询结果只有一行时...
### Oracle到SQL Server存储过程语法转换详解 在数据库迁移项目中,从Oracle迁移到SQL Server是一种常见的场景。本文旨在提供一份详细的指南,帮助开发者更好地理解这两种数据库系统在存储过程方面的语法差异,并...
《SQL2000与Oracle的语法区别》 在数据库管理领域,SQL Server 2000 和 Oracle 是两种广泛使用的数据库系统,它们都遵循SQL(结构化查询语言)标准,但在具体语法实现上有所不同。这篇文章将深入探讨两者在语法层面...
本文将重点介绍如何在SQL Server 2008环境中轻松编写T-SQL存储过程,并通过具体的示例来展示其实现方法。 #### 二、SQL Server Management Studio (SSMS) 在SQL Server 2008中,SQL Server Management Studio ...
4. **执行SQL语句并获取结果**:利用`EXECUTE IMMEDIATE`执行SQL查询,并将结果集中的第一列(即记录数)赋值给变量`N`。 5. **输出结果**:最后通过`DBMS_OUTPUT.PUT_LINE`函数输出查询结果。 ##### 示例二:创建...
本资源主要关注“SQL存储过程的创建与调用”,这对于数据库开发人员来说是至关重要的技能。 1. **存储过程的创建** 创建存储过程通常使用`CREATE PROCEDURE`语句。例如,一个简单的存储过程可能用于计算两个数的和...
### SQL存储过程IN参数的解决办法 #### 方法一:使用临时表进行参数处理 此方法主要利用了SQL Server中的临时表来实现对多个输入参数的处理。具体步骤如下: 1. **定义变量**:首先定义了一个`nvarchar(200)`类型...
SET和SELECT都可以用来给变量赋值,但它们在处理复杂表达式时有区别。SET在遇到返回多个值的表达式时会报错,而SELECT则会取最后一个返回的值赋给变量。如果表达式没有返回值,SET会将变量设置为NULL,而SELECT会...