• T-SQL查询进阶--变量


     

     

    概述

         变量对于一种语言是必不可少的一部分,当然,对于T-SQL来讲也是一样。在简单查询中,往往很少用到变量,但无论对于复杂的查询或存储过程中,变量都是必不可少的一部分.

    变量的种类

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

         1.全局变量是由系统定义的,在整个SQL SERVER实例内都能访问到的变量.全局变量以@@作为第一个字符,用户只能访问,不能赋值。

         2.局部变量由用户定义,生命周期只在一个批处理内有效。局部变量以@作为第一个字符,由用户自己定义和赋值。

       

         一个简单的例子如下

          1

         因为全局变量仅仅是用于读取系统的一些参数,具体每个全局变量所代表的含义请Google之…本文主要介绍局部变量(也就是用户自定义变量).

    Transact-SQL语言中有两种形式的变量,一种是用户自己定义的局部变量,另外一种是系统提供的全局变量。
    局部变量

    局部变量是一个能够拥有特定数据类型的对象,它的作用范围仅限制在程序内部。局部变量可以作为计数器来计算循环执行的次数,或是控制循环执行的次数。另外,利用局部变量还可以保存数据值,以供控制流语句测试以及保存由存储过程返回的数据值等。局部变量被引用时要在其名称前加上标志“@”,而且必须先用DECLARE命令定义后才可以使用。

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

    使用全局变量时应该注意以下几点:
    ①全局变量不是由用户的程序定义的,它们是在服务器级定义的。
    ②用户只能使用预先定义的全局变量。
    ③引用全局变量时,必须以标记符“@@”开头。
    ④局部变量的名称不能与全局变量的名称相同,否则会在应用程序中出现不可预测的结果。

    select @@ERROR 返回最后执行的 Transact-SQL 语句的错误代码(integer) (0,表示没错误;1,表示有错误)

    select APP_NAME ( ) as w --当前会话的应用程序

    select @@IDENTITY   --返回最后插入的标识值
    select USER_NAME()    --返回用户数据库用户名

    SELECT @@CONNECTIONS  --返回自上次SQL启动以来连接或试图连接的次数。
    SELECT GETDATE() --当前时间
    SELECT @@CPU_BUSY/100  --返回自上次启动SQL 以来 CPU 的工作时间,单位为毫秒

    USE tempdb SELECT @@DBTS  as w  --为当前数据库返回当前 timestamp 数据类型的值。这一 timestamp 值保证在数据库中是唯一的。
    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上允许的同时用户连接的最大数。返回的数不必为当前配置的数值
    EXEC sp_configure  --显示当前服务器的全局配置设置
    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 @@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服务器安装的日期、版本和处理器类型。

    局部变量的用途

         在T-SQL中,局部变量是一个存储指定数据类型单个值的对象.T-SQL中对变量的定义实际上和大多数高级语言一样.

         局部变量在使用中常常用于以下三种用途:

         1.在循环语句中记录循环的次数或者用于控制循环的次数.

         2

         2.用于存储流程语句来控制流程走向

        3

         3.储存存储过程或者函数的返回值

         4

         实际上,存储任何业务数据的局部变量都属于这一类应用.

    局部变量的声明

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

         5

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

      

          一切只声明没有赋值的局部变量的初始值都为”NULL”.

    局部变量的赋值

          在T-SQL中,局部变量的赋值是通过”Set”关键字和”Select”关键字实现的.

          实际上,使用Set或者是Select取决于下面几个因素

    1.当对多个变量赋值时

          SELECT关键字支持多个变量赋值,而SET关键字只支持一次对一个值赋值

          6

    2.当赋值时表达式返回值的个数

         使用SET进行赋值时,当表达式返回多个值时,报错.而SELECT关键字在赋值表达式返回多个值时,取最后一个.

         比如,假设XXX表只有以下几条数据:

         7

         当使用SELECT关键字进行时,可以取返回值的最后一个。

         8

    3.当表达式未返回值时

          使用SET对局部变量赋值时,如果赋值表达式未返回值,则局部变量变为NULL,而SELECT对表达式赋值时,如果表达式未返回值,则局部变量保持原值.

          9

    4.当…你是一个标准爱好者时

          坚决使用SET关键字对局部变量赋值吧,因为SET是ANSI标准……

    5.当…你懒得记上述何时使用SET或是何时使用SELECT时

          好吧,我承认我也很懒.那你按照一个简单的方式区别:当你的赋值语句需要引用一个数据源(表)时,使用SELECT.除此之外,使用SET.

    局部表变量

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

          10

           这样会大大提高多表连接的查询速度.

    总结

          本文介绍了变量种类以及局部变量的使用范围,定义以及赋值方法.还简单介绍了表变量。在复杂查询中,系统的了解T-SQL的变量是写出好的查询语句必不可少的一部分。

  • 相关阅读:
    VS安装部署
    C#与C/C++的交互
    3、C#入门第3课
    登录接口,猜年龄
    安装sql server 2016 always on配置dtc支持时遇到的问题
    购物车第一版
    Oracle patch查看路径
    innobackup增量备份脚本
    在vmware workstation下安装linux6关闭防火墙
    线程池-连接池-JDBC实例-JDBC连接池技术
  • 原文地址:https://www.cnblogs.com/yzl495/p/4265321.html
Copyright © 2020-2023  润新知