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
分享到:
相关推荐
在编写存储过程时,我们经常需要对变量进行赋值,这时就涉及到`SET`和`SELECT`两种不同的赋值方式。尽管两者都可以用来对变量进行赋值,但它们之间存在一些关键区别。 首先,SQL Server官方推荐在对单个变量赋值时...
表2比较了SQL Server和Kingbase ES 3.1在变量表示和赋予值方面的不同,这为理解两种数据库在语法层面的差异提供了具体实例。 表3则详细列举了SQL Server和Kingbase ES 3.1之间一些常用的函数对应关系,比如日期和...
本文旨在提供一份详细的指南,帮助开发者更好地理解这两种数据库系统在存储过程方面的语法差异,并指导如何进行有效的转换。 #### 一、基本语法差异 **1. 变量声明** - **Oracle**: 变量命名自由度较高,不需要...
- **MS SQL Server** 中,变量定义使用 `DECLARE @variable AS type;` 语法,而赋值则通过 `SET @variable = value;` 或 `SELECT @variable = value;`。 - **PostgreSQL** 中,变量定义使用 `DECLARE variable type;...
下面我们将从数据类型、变量定义与赋值、IF/ELSE 控制结构等方面对这两种数据库的差异进行详细的比较。 数据类型 PostgreSQL 和 MS SQL Server 都支持多种数据类型,如数字类型、字符类型、日期类型等。 数字类型...
Oracle 和 SQL Server 是两种广泛应用的关系型数据库管理系统,它们在语法和功能上存在一定的差异。以下是对两者主要区别的一些详细说明: 1. **伪列 ROWNUM**: 在Oracle中,ROWNUM是一个伪列,用于获取结果集中...
Oracle 和 SQL Server 是两种广泛使用的关系型数据库管理系统,尽管它们都支持 SQL 语句,但是它们之间存在一些语法差异。在本文中,我们将对 Oracle 和 SQL Server 的 SQL 语法差异进行总结。 存储过程 Oracle 中...
在IT行业中,数据库管理系统是核心组件之一,Oracle和SQL Server是两种广泛应用的关系型数据库系统。它们在语法上有诸多差异,这些差异主要体现在存储过程、自定义函数、游标、变量、赋值、语句结束符以及大小写敏感...
C#笔记五[SQLServer高级开发技能] 本篇笔记主要介绍了SQL Server高级开发技能,涵盖了数据库安全机制、登录验证方式、登录账号类型、数据库用户管理、角色管理和T-SQL高级编程等方面的知识点。 一、数据库安全机制...
数据库管理系统(DBMS)中的 SQL Server 是一种关系型数据库管理系统,用于存储、管理和检索数据。为了高效地管理和操作数据库,SQL Server 提供了一系列关键字和语法,以下是 SQL Server 的一些常用关键字和语法。 ...
在数据库管理领域,Sybase和Microsoft SQL Server是两种广泛应用的关系型数据库管理系统。它们虽然都遵循SQL标准,但在语法上存在一些显著的区别。以下是一些主要的语法差异: 1. **变量赋值**: - Sybase中,为...
在SQL Server中,动态SQL是执行SQL语句的一种方式,特别是在需要在运行时构建SQL语句的情况下非常有用。`EXEC`或`sp_executesql`是执行这些动态SQL语句的关键函数。本例中,我们将深入探讨如何在SQL Server中处理...
- CASE:用于计算条件列表并返回多个可能的结果表达式之一,分为简单CASE函数和CASE搜索函数两种格式。 - WAITFOR:用于暂停SQL Server命令的执行直到指定的延迟时间或时间点。 - WHILE...CONTINUE...BREAK:用于...
在数据库领域,Oracle 和 SQL Server 是两种广泛应用的关系型数据库管理系统,它们各自具有独特的特性和功能。以下将详细介绍这两个系统在函数用法、系统时间获取、日期转换、行号显示、字符串定义类型以及存储过程...
- Oracle同样支持这两种方式,但在Oracle中,`--`必须紧跟在语句开头且无空格,而`/*...*/`则与SQL Server相同。 2. **声明变量**: - 在SQL Server中,使用`DECLARE`关键字,如`DECLARE @var_name type[size]`。...
在数据库管理领域,SQL Server 和 Oracle 是两种广泛应用的关系型数据库管理系统。它们在语法上存在一些显著的差异,尤其是在处理存储过程和函数时。以下是一些关键的语法转换点,可以帮助理解如何从 Oracle 转换到 ...
在SQL Server中,通常使用SET给局部变量赋值,使用SELECT将数据查询结果赋值给变量。 ### 完整的对象名称由四个标识符组成 在SQL Server中,对象名称可以包含四个部分:服务器名称、数据库名称、所有者名称和对象...
在SQL Server 2005中,有两种主要的连接方式:**Named Pipes** 和 **TCP/IP**。 - **Named Pipes**:这是一种通过共享内存进行通信的方式,适用于同一台计算机或网络上距离较近的计算机之间的连接。它提供了高速的...