SQL Server在T-SQL语句中使用变量

变量的种类

在T-SQL中,变量按生存范围可以分为全局变量(Global Variable)和局部变量(Local Variable)

  • 全局变量是由系统定义的,在整个SQL Server实例内都能访问到的变量,全部变量以@@开头,用户只能访问,不能赋值。
  • 局部变量由用户定义,生命周期只在一个批处理内有效。局部变量以@作为第一个字符,由用户自己定义和复制。

示例:

DECLARE @i int    --声明一个int类型局部变量
  SET @i = 10      --通过SET对局部变量进行赋值

  DECLARE @Name nvarchar(20)    --声明一个nvarchar(20)类型变量
  SET @Name = '张飞'

  PRINT @@VERSION     --全部变量,只能读取,不能赋值
  SET @@VERSION = '123'    --此行代码报错

全局变量

全局变量的用途

  • 全局变量是SQL Server系统内部使用的变量,其作用范围并不仅仅局限于某一程序,而是任何程序均可以随时调用。
  • 全局变量通常存储一些SQL Server的配置设定值和统计数据。用户可以在程序中用全局变量来测试系统的设定值或者是Transact-SQL命令执行后的状态值。

全局变量列表

select @@CONNECTIONS; --返回自上次SQL启动以来连接或试图连接的次数。
select @@CPU_BUSY / 100; --返回自上次启动SQL 以来 CPU 的工作时间,单位为毫秒
select @@CURSOR_ROWS as w; --返回被打开的游标中还未被读取的有效数据行的行数
select @@DATEFIRST as w; --返回使用SET DATEFIRST 命令而被赋值的DATAFIRST ,用来指定每周的第一天是星期几
select @@FETCH_STATUS as w; --返回上一次FETCH 语句的状态值(0:成功,-1失败或行超过结果集,-2行没找到)
select @@DBTS as w; --为当前数据库返回当前 timestamp 数据类型的值。这一 timestamp 值保证在数据库中是唯一的。
select @@ERROR; --返回最后执行的 Transact-SQL 语句的错误代码(integer) (0,表示没错误;1,表示有错误)
select @@IDENTITY as w; --返回最后插入的标识值
select @@IDLE as w; --返回SQL自上次启动后闲置的时间,单位为毫秒
select @@IO_BUSY as w; --返回SQL自上次启动后用于执行输入和输出操作的时间,单位为毫秒
select @@LANGID as w; --返回当前所使用语言的本地语言标识符(ID)。
select @@LANGUAGE as w; --返回当前使用的语言名
select @@LOCK_TIMEOUT as w; --当前会话的当前锁超时设置,单位为毫秒。
select @@MAX_CONNECTIONS as w; --返回SQL上允许的同时用户连接的最大数。返回的数不必为当前配置的数值
select @@MAX_PRECISION as w; --返回 decimal 和 numeric 数据类型所用的精度级别,即该服务器中当前设置的精度。默认最大精度38。
select @@OPTIONS as w; --返回当前 SET 选项的信息。
select @@PACK_RECEIVED as w; --返回SQL自启动后从网络上读取的输入数据包数目。
select @@PACK_SENT as w; --返回SQ自上次启动后写到网络上的输出数据包数目。
select @@PACKET_ERRORS as w; --返回自SQL启动后,在SQL连接上发生的网络数据包错误数。
select @@ROWCOUNT as w; --返回上一次语句影响的数据行的行数
select @@SERVERNAME as w; --返回运行SQL服务器名称。
select @@SERVICENAME as w; --返回SQL正在其下运行的注册表键名
select @@TIMETICKS as w; --返回SQL服务器一刻度的微秒数
select @@TOTAL_ERRORS as w; --返回 SQL服务器自启动后,所遇到的磁盘读/写错误数。
select @@TOTAL_READ as w; --返回 SQL服务器自启动后读取磁盘的次数。
select @@TOTAL_WRITE as w; --返回SQL服务器自启动后写入磁盘的次数。
select @@TRANCOUNT as w; --返回当前连接的活动事务数。
select @@VERSION as w; --返回当前安装的SQL Server 的日期版本处理器

局部变量

局部变量的用途

  • 在循环中记录循环次数
  • 储存存储过程或者函数的返回值

局部变量的声明

局部变量的声明必须以"DECLARE"作为关键字,变量的命名必须以"@"作为变量名的第一个字符,必须为所声明的变量提供一个数据类型和数据长度。
如:

DECLARE @Name nvarchar(20)

注意:局部变量的数据类型不能为Text,ntext,和Image类型,当对于字符型变量只提供数据类型没有提供数据长度时,数据长度默认为1.

设置变量中的值(赋值)

有两种设置变量值方法。可以使用SELECE语句或者SET语句。从功能上看,它们的作用几乎是相同的,不同的是SELECT语句允许元数据值来自SELECT语句中的某一列。

1、使用SET设置变量

DECLARE @i int,@j int
  set @i = 10;
  set @j = 20;
  select @i + @j

用查询到的值设置变量:

DECLARE @i int
  SET @i = (select MAX(Age) from Person)  --当使用SET时如果返回结果有多行也会报错。同时如果返回多条记录也报错
  SELECT @i

2、使用SELECT设置变量:

当变量中存储的信息来源于查询时,经常使用SELECT给变量赋值,语法比较简便。

DECLARE @i int
  SELECT @i = 100
  SELECT @i

查询的信息为变量赋值:

DECLARE @i int
   SELECT @i = Age from Person_1 order by Id desc    --当返回多个值时用最后一个赋值
   PRINT @i

SELECT同时设置多个值:

DECLARE @Name varchar(20)
  DECLARE @i int
  SELECT @i = 10, @Name = '张飞'

3、当表达式未返回值时

  • 使用SET对局部变量赋值时,如果赋值表达式未返回值,则局部变量变为NULL;而SELECT对表达式赋值时,如果表达式未返回值,则局部变量保持原值。
  • 一切只声明没有赋值的局部变量的初始值都为”NULL”。

例如:

DECLARE @Name nvarchar(50)
  SET @Name = '黄飞鸿'
  select @Name = Name from Person_1 where Id = 100    --100不存在记录,此处如果改为一个Id存在的,且Name列不为null的值,则@Name变量的值就变了
  PRINT @Name  --依然打印的是黄飞鸿

可见,当SELECT表达式赋值时,如果为返回值,则保持原值。

局部表变量

局部表变量是一个特殊的局部变量。和临时表不同,局部表变量具有一切局部变量的特点。在查询中,因为局部表变量是存在内存中,而不是硬盘中,所以速度会远远快于临时表或是实际表。局部表变量最多的使用是在查询中充当多个表做连接时的中间表

DECLARE @TempTable TABLE    --声明一个局部表变量
(
    Id int,
    Name nvarchar(50)
)
INSERT INTO @TempTable     --用查询到的作为数据插入到局部表变量
SELECT Id,Name FROM Person_1

SELECT * FROM @TempTable    --和普通表一样用,可以各种join,子查询等等。

到此这篇关于SQL Server在T-SQL语句中使用变量的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SQLSERVER 拼接含有变量字符串案例详解

    一.拼接字符串(整个字符串不分割)步骤: 首先在字符串的前后加单引号: 字符串中的变量以'''+@para+'''在字符串中表示: 若在执行时存在类型转换错误,则应用相应的类型转换函数,对变量进行类型转换(如cast()函数). 示例一: 包含SQL拼接字符串的存储过程: Create Procedure Test @TestID int As Declare @s nvarchar(800) Set @s='Select * From dbo.Categories where Category

  • SQL Server 表变量和临时表的区别(详细补充篇)

    一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约束不能在表变量中使用).定义表变量的语句是和正常使用Create Table定义表语句的子集.只是表变量通过DECLARE @local_variable语句进行定义. 表变量的特征: 1.表变量拥有特定作用域(在当前批处理语句中,但不在任何当前批处理语句调用的存储过程和函数中),表变量在批处理结束

  • SQL Server中使用表变量和临时表

    一.表变量 表变量在SQL Server 2000中首次被引入. 表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键约束不能在表变量中使用). 定义表变量的语句是和正常使用Create Table定义表语句的子集.只是表变量通过DECLARE @local_variable语句进行定义. 1.定义和使用表变量 定义一个表变量,插入一条数据,然后查询: DECLARE @tb1 Table ( Id int, Na

  • SQLServer中临时表与表变量的区别分析

    在实际使用的时候,我们如何灵活的在存储过程中运用它们,虽然它们实现的功能基本上是一样的,可如何在一个存储过程中有时候去使用临时表而不使用表变量,有时候去使用表变量而不使用临时表呢? 临时表 临时表与永久表相似,只是它的创建是在Tempdb中,它只有在一个数据库连接结束后或者由SQL命令DROP掉,才会消失,否则就会一直存在.临时表在创建的时候都会产生SQL Server的系统日志,虽它们在Tempdb中体现,是分配在内存中的,它们也支持物理的磁盘,但用户在指定的磁盘里看不到文件. 临时表分为本地

  • sqlserver 临时表 Vs 表变量 详细介绍

    这里我们在SQL Server 2005\SQL Server 2008版本上通过举例子,说明临时表和表变量两者的一些特征,让我们对临时表和表变量有进一步的认识.在本章中,我们将从下面几个方面去进行描述,对其中的一些特征举例子说明: 约束(Constraint) 索引(Index) I/0开销 作用域(scope) 存儲位置 其他 例子描述 约束(Constraint) 在临时表和表变量,都可以创建Constraint.针对表变量,只有定义时能加Constraint. e.g.在Microsof

  • Sqlserver 表类型和表变量介绍

    表类型可以用在存储过程中,用于批量增加表类型定义: 复制代码 代码如下: CREATE TYPE dbo.SubCardTable as table  (       [SC_ID] [varchar](50),       [ZhuKaInfo_ID] [varchar](50),       [Project_KeyName] [varchar](50),       [SC_CardNumber] [varchar](50),       [Statues] [int] DEFAULT 0

  • SQLserver中的declare变量用法

    SQL中的declare用法 平时写SQL查询.存储过程都是凭着感觉来,没有探究过SQL的具体语法,一直都是按c#那一套往SQL上模仿,前几天项目中碰到一个问题引起了我对declare定义变量的作用域的兴趣. 大家都知道c#中的局部变量,在if中如果我们定义一个变量的话他的作用到if结束为止,if外是不识别这个变量的,else里都不能使用,简单的写一下. if(true) { Int32i=1; Console.WriteLine(i); } 这个i的作用域就是if里面,如果我们在if外面用这个

  • sqlserver 局部变量的使用

    A. 使用 DECLARE 下例使用名为 @find 的局部变量检索所有姓以 Ring 开头的作者信息. 复制代码 代码如下: Use pubs declare @find varchar(30) set @find='Ring%' select au_lname,au_fname,phone from authors where au_lname like @find @find就是一个局部变量. B. 在 DECLARE 中使用两个变量 下例从 Binnet & Hardley (pub_i

  • 在SQL Server的try...catch语句中获取错误消息代码的的语句

    复制代码 代码如下: BEGIN TRY ... ... END TRY BEGIN CATCH DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT; DECLARE @ErrorState INT; SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE(); RAISER

  • SQL Server在T-SQL语句中使用变量

    变量的种类 在T-SQL中,变量按生存范围可以分为全局变量(Global Variable)和局部变量(Local Variable) 全局变量是由系统定义的,在整个SQL Server实例内都能访问到的变量,全部变量以@@开头,用户只能访问,不能赋值. 局部变量由用户定义,生命周期只在一个批处理内有效.局部变量以@作为第一个字符,由用户自己定义和复制. 示例: DECLARE @i int --声明一个int类型局部变量 SET @i = 10 --通过SET对局部变量进行赋值 DECLARE

  • SQL Server如何通过SQL语句直接操作另一台服务器上的SQL SERVER的数据

    SQL Server如何通过SQL语句直接操作另一个SQL SERVER的数据 1. 现在执行SQL语句的数据库服务器开启Ad Hoc Distributed Queries exec sp_configure 'showadvanced options',1 reconfigure exec sp_configure 'Ad HocDistributed Queries',1 reconfigure 2.通过openrowset(‘SQLOLEDB’,’另一个SQLSERVER数据库IP’;

  • SQL Server LocalDB 在 ASP.NET中的应用介绍

    我相信世界总是会向更好的方向发展,今年的维也纳新年音乐会没有往年的明星级指挥,但是它通过回归奥地利的本质,以更传统的聚合法则,让过往的艺术家们一代代创造的灿烂,在新的指挥手中,迸发出更深邃的音节.在此,也祝大家新年快乐.如同交响乐一样,构造软件系统不一定必须某个强大的明星驱动,我们站在历代ADO.NET的肩膀上,更好地回归到SQL Server的核心开发:SQL Server LocalDB 在 ASP.NET中的应用. 使用SQL Server LocalDB的优势: 快速部署完整的SQL S

  • 分享一下SQL Server执行动态SQL的正确方式

    SQL Server执行动态SQL的话,应该如何实现呢?下面就为您介绍SQL Server执行动态SQL两种正确方式,希望可以让您对SQL Server执行动态SQL有更深的了解 动态SQL:code that is executed dynamically.它一般是根据用户输入或外部条件动态组合的SQL语句块.动态SQL能灵活的发挥SQL强大的功能.方便的解决一些其它方法难以解决的问题.相信使用过动态SQL的人都能体会到它带来的便利,然而动态SQL有时候在执行性能(效率)上面不如静态SQL,而

  • Sql Server 2008R2升级Sql Server 2012图文教程

    环境: Windows server 2008 r2 Standard +SqlServer2008R2 内网环境需要升级为SQL server 2012 升级安装时提示版本不支持 网上查询相关问题, 必须是SQL server2008 r2 sp1以上及需要安装Sp2补丁包才能升级为SQL server 2012 1)下载地址:微软官网 https://www.microsoft.com/zh-CN/download/details.aspx?id=30437 2)选择你对应的安装SQL se

  • mysql查询语句中用户变量的使用代码解析

    上一篇文章中我们介绍了MySQL优化总结-查询总条数.这篇文章我们来介绍下查询语句中的另一个知识:用户变量的使用代码解析. 先上代码吧 SELECT `notice`.`id` , `notice`.`fid` , `notice`.`has_read` , `notice`.`notice_time` , `notice`.`read_time` , `f`.`fnum` , `f`.`forg` , `f`.`fdst` , `f`.`actual_parking` AS `parking`

  • Java 如何在switch case语句中声明变量

    目录 在switch case语句中声明变量 第一种情况常见的场景为 第二种情况常见的场景为 Java switch-case语句用法及例题 原理归原理,下面是一个例题 在switch case语句中声明变量 Java中使用switch case语句时很容易出现以下两个报错: 1.Duplicate local veriable out. (局部变量重复) 2.The local veriable out may not have been initialized. (局部变量可能未被初始化)

  • 详解SQL Server的简单查询语句

    前言 对于一些原理性文章园中已有大量的文章尤其是关于索引这一块,我也是花费大量时间去学习,对于了解索引原理对于后续理解查询计划和性能调优有很大的帮助,而我们只是一些内容进行概括和总结,这一节我们开始正式步入学习SQL中简单的查询语句,简短的内容,深入的理解. 简单查询语句 所有复杂的语句都是由简单的语句组成基本都是由SELECT.FROM.WHERE.GROUP BY.HAVING.ORDER BY等组成,当然还包括一些谓词等等.比如当我们要查询某表中所有数据时我们会像如下进行. SELECT

  • Access和SQL Server里面的SQL语句的不同之处

    我的感觉是,Accees数据库虽然可以称得上是小型的关系型数据库,并且也是使用的结构化查询语言SQL,但它的语法(主要体现在函数上),却类似vbscript的语法,我想,这应该和Access属于Office系列有关,基于它的开发和应用,自然就与VBA扯上关系,因而Access的函数库也就是VBA的函数库,而非SQL函数库.下面,我们来具体看下Access和SQL Server在查询语句的编写上具体的不同. 一.数据类型转换: Access: SELECT '调查'+CStr(Did) as di

随机推荐