SQL Server 中的 @、@@、#、## 、N 代表什么,以及SQL系统常用全局变量

变量类型:
@@为全局变量,数据库提供的
@局部变量,用户自定义

QL中的 @、@@、#、## 、N 代表什么

@ 表示局部变量
@@ 表示全局变量
'#' 表示本地临时表的名称,以单个数字符号打头;它们仅对当前的用户连接是可见的
'##' 表示全局临时表
N 代表存入数据库时以 Unicode 格式存储(双字节),不带N是以普通字符常量存储(单字节)。例如:N'你好'  ---2020.03.17
'#'本地临时表,以一个井号 (#) 开头的表名。
只有在创建本地临时表连接是才能看得到,连接断开时临时表立马被删除,也就是到货本地临时表为创建它的该链接的会话所独有,或者说局部临时表是有当前用户创建的,并且只有当前用户的会话才可以访问。

'##'全局临时表,以两个井号 (##) 开头的表名。
在所有连接上都能看到全局临时表,也就是说只要全局临时表存在,那么对所有创建用户的会话后都是可见的。如果在创建全局临时表的连接断开前没有显式地除去全局临时表,那么只能等到其它所有任务都停止引用,这些表才会被删除。
当创建全局临时表的连接断开后,新的任务不能再引用它们,也就是说旧的任务才可以引用。当前的语句一执行完,任务与表之间的关联即被除去;因此通常情况下,只要创建全局临时表的连接断开,全局临时表也会同时被删除。

常用系统全局变量:

@@CONNECTIONS    返回自上次启动以来连接或试图连接的次数。
@@CURSOR_ROWS   返回连接上最后打开的游标中当前存在的合格行的数量(返回被打开的游标中还未被读取的有效数据行的行数)
@@DATEFIRST   返回每周第一天的数字
@@ERROR   返回最后执行的SQL 语句的错误代码。
@@FETCH_STATUS   返回被 FETCH 语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。
@@IDENTITY   返回最后插入的标识值
@@LANGID   返回当前所使用语言的本地语言标识符(ID)。
@@LANGUAGE   返回当前使用的语言名。
@@LOCK_TIMEOUT   返回当前会话的当前锁超时设置,单位为毫秒。
@@PROCID   返回当前过程的存储过程标识符 (ID) 。
@@ROWCOUNT   返回受上一语句影响的行数。
@@SERVERNAME   返回运行 的本地服务器名称。
@@SPID   返回当前用户进程的服务器进程标识符 (ID)。
@@TRANCOUNT   返回当前连接的活动事务数。
@@VERSION   返回当前安装的日期、版本和处理器类型。
@@CPU_BUSY   返回自SQL Server 最近一次启动以来CPU 的工作时间其单位为毫秒
@@DATEFIRST   返回使用SET DATEFIRST 命令而被赋值的DATAFIRST 参数值SET DATEFIRST,命令用来指定每周的第一天是星期几
@@DBTS   返回当前数据库的时间戳值必须保证数据库中时间戳的值是惟一的
@@ERROR   返回执行Transact-SQL 语句的错误代码
@@FETCH_STATUS   返回上一次FETCH 语句的状态值
@@IDLE     返回自SQL Server 最近一次启动以来CPU 处于空闭状态的时间长短单位为毫秒
@@IO_BUSY   返回自SQL Server 最近一次启动以来CPU 执行输入输出操作所花费的时间其单位为毫秒
@@LANGID   返回当前所使用的语言ID 值
@@LANGUAGE   返回当前使用的语言名称
@@LOCK_TIMEOUT   返回当前会话等待锁的时间长短其单位为毫秒
@@MAX_CONNECTIONS   返回允许连接到SQL Server 的最大连接数目
@@MAX_PRECISION   返回decimal 和numeric 数据类型的精确度
@@NESTLEVEL   返回当前执行的存储过程的嵌套级数初始值为0
@@OPTIONS   返回当前SET 选项的信息
@@PACK_RECEIVED   返回SQL Server 通过网络读取的输入包的数目
@@PACK_SENT   返回SQL Server 写给网络的输出包的数目
@@PACKET_ERRORS   返回网络包的错误数目
@@PROCID   返回当前存储过程的ID 值
@@REMSERVER   返回远程SQL Server 数据库服务器的名称
@@SERVICENAME   返回SQL Server 正运行于哪种服务状态之下如MSSQLServer MSDTC SQLServerAgent
@@SPID   返回当前用户处理的服务器处理ID 值
@@TEXTSIZE   返回SET 语句的TEXTSIZE 选项值SET 语句定义了SELECT 语句中text 或image数据类型的最大长度基本单位为字节
@@TIMETICKS   返回每一时钟的微秒数
@@TOTAL_ERRORS   返回磁盘读写错误数目
@@TOTAL_READ   返回磁盘读操作的数目
@@TOTAL_WRITE   返回磁盘写操作的数目
@@TRANCOUNT   返回当前连接中处于激活状态的事务数目

————————————————
123
execute相信大家都用的用熟了,简写为exec,除了用来执行存储过程,一般都用来执行动态Sql
sp_executesql,sql2005中引入的新的系统存储过程,也是用来处理动态sql的, 如:
exec sp_executesql @sql, N'@count int out,@id varchar(20)', @cou out ,@id
@sql为拼成的动态sql
N'@count int out,@id varchar(20)'为拼成的动态sql内的参数列表
@cou out,@id为为动态sql内参数列表提供值的外部参数列表

那么它们之间有什么区别呢?

1、它们之间最大的区别是嵌入式的参数,如下面一个语句
DECLARE @sql NVARCHAR(2000);
DECLARE @id VARCHAR(20);
SET @id = '1';
SET @sql = 'select count() from emp where id=' + @id;
EXEC @sql;
我想把得到的count(
)传出来,用传统的exec是不好办到的,但是用sp_executesql则很容易就办到了:
DECLARE @sql NVARCHAR(2000);
DECLARE @cou INT;
DECLARE @id VARCHAR(20);
SET @id = '1';
SET @sql = 'select @count=count(*) from emp where id=@id';
EXEC sp_executesql @sql, N'@count int out,@id varchar(20)', @cou OUT, @id;
PRINT @cou;
2、性能
可以看到,如果用exec,由于每次传入的@id不一样,所以每次生成的@sql就不一样,这样每执行一次Sql2005就必须重新将要执行的动态Sql重新编译一次
但是sp_executesql则不一样,由于将数值参数化,要执行的动态Sql永远不会变化,只是传入的参数的值在变化,那每次执行的时候就秒用重新编译,速度自然快多了哈!

注意:
1.sp_executesql要求动态Sql和动态Sql参数列表必须是Nvarchar,比如上个例子的@sql,N'@count int out,@id varchar(20)'我记得在sql2005中Varchar也可以的,但是我打了Sp3补丁后就不行了,必须为Nvarchar
2.动态Sql的参数列表与外部提供值的参数列表顺序必需一致,如:
N'@count int out,@id varchar(20)', @cou out,@id
@count 对应 @cou,@id对应@id
如果不一致,必须显式标明,如:
N'@count int out,@id varchar(20)', @id=@id, @count=@cou out
3.动态SQl的参数列表与外部提供参数的参数列表参数名可以同名

posted @ 2022-02-15 14:06  半个程序猿Cohen_Lee  阅读(3027)  评论(0编辑  收藏  举报