SQL Server 2008中的全局变量及其用法
T-SQL程序中的变量分为全局变量和局部变量两类,全局变量是由SQL Server系统定义和使用的变量。DBA和用户可以使用全局变量的值,但不能自己定义全局变量。下面详细总结一下SQL Server 2008中的33个全局变量,并且写一下示例.
@@CONNECTIONS
返回 SQL Server 自上次启动以来尝试的连接数,无论连接是成功还是失败。
返回类型 integer
备注:@@MAX_CONNECTIONS 是允许同时连接到服务器的最大连接数。@@CONNECTIONS 随每次登录尝试而增加,因此 @@CONNECTIONS 可以比 @@MAX_CONNECTIONS 大。
示例:
SELECT GETDATE() AS 'Today''s Date and Time',
@@CONNECTIONS AS 'Login Attempts'
Today's Date and Time Login Attempts
---------------------- --------------
@@CPU_BUSY
返回 SQL Server 自上次启动后的工作时间。其结果以 CPU 时间增量或“滴答数”表示,此值为所有 CPU 时间的累积,因此,可能会超出实际占用的时间。乘以 @@TIMETICKS 即可转换为微秒。
返回类型 integer
示例:
SELECT @@CPU_BUSY * CAST(@@TIMETICKS AS FLOAT) AS 'CPU microseconds',
GETDATE() AS 'As of' ;
CPU microseconds As of
---------------- -----------------------
@@CURSOR_ROWS
返回连接上打开的上一个游标中的当前限定行的数目。为了提高性能,Microsoft SQL Server 可异步填充大型键集和静态游标。可调用 @@CURSOR_ROWS 以确定当其被调用时检索了游标符合条件的行数。
返回类型 integer
返回值 说明
-m 游标被异步填充。返回值 (-m) 是键集中当前的行数。
-1 游标为动态游标。因为动态游标可反映所有更改,所以游标符合条件的行数不断变化。因此,永远不能确定已检索到所有符合条件的行。
0 没有已打开的游标,对于上一个打开的游标没有符合条件的行,或上一个打开的游标已被关闭或被释放。
n 游标已完全填充。返回值 (n) 是游标中的总行数。
USE AdventureWorks;
GO
SELECT @@CURSOR_ROWS;
DECLARE Name_Cursor CURSOR FOR
SELECT LastName ,@@CURSOR_ROWS FROM Person.Contact;
OPEN Name_Cursor;
FETCH NEXT FROM Name_Cursor;
SELECT @@CURSOR_ROWS;
CLOSE Name_Cursor;
DEALLOCATE Name_Cursor;
GO
-----------
0
LastName
---------------
Achong
-----------
-1
@@DATEFIRST
针对会话返回 SET DATEFIRST 的当前值
返回类型 tinyint
示例:
SET DATEFIRST 5;
SELECT @@DATEFIRST AS 'First Day'
,DATEPART(dw, SYSDATETIME()) AS 'Today';
First Day Today
---------------- --------------
5 2
@@DBTS
返回当前数据库的当前 timestamp 数据类型的值。这一时间戳值在数据库中必须是唯一的。
返回类型 varbinary
示例:
从AdventureWorks数据库返回当前的timestamp
use AdventureWorks
go
select @@dbts
@@ERROR
返回执行的上一个 Transact-SQL 语句的错误号
返回类型 integer
如果前一个 Transact-SQL 语句执行没有错误,则返回 0。
如果前一个语句遇到错误,则返回错误号。如果错误是 sys.messages 目录视图中的错误之一,则 @@ERROR 将包含 sys.messages.message_id 列中表示该错误的值。可以在 sys.messages 中查看与 @@ERROR 错误号相关的文本信息。
由于 @@ERROR 在每一条语句执行后被清除并且重置,因此应在语句验证后立即查看它,或将其保存到一个局部变量中以备以后查看。
使用 TRY...CATCH 构造来处理错误。TRY...CATCH 构造也支持其他返回的错误信息多于 @@ERROR 的系统函数(ERROR_LINE、ERROR_MESSAGE、ERROR_PROCEDURE、ERROR_SEVERITY 和 ERROR_STATE)。TRY...CATCH 也支持 ERROR_NUMBER 函数,但不限制该函数在语句产生错误后立即在语句中返回错误号。
以下示例用 @@ERROR 在 UPDATE 语句中检测约束检查冲突(错误 #547)。
USE AdventureWorks
GO
UPDATE HumanResources.EmployeePayHistory
SET PayFrequency = 4
WHERE EmployeeID = 1;
IF @@ERROR = 547
PRINT N'A check constraint violation occurred.';
GO
在此示例中,IF...ELSE 语句在存储过程中的 INSERT 语句后检测 @@ERROR。@@ERROR 变量的值将决定发送给调用程序的返回代码,以指示此过程的成功与失败。
USE AdventureWorks;
GO
-- Drop the procedure if it already exists.
IF OBJECT_ID(N'HumanResources.usp_DeleteCandidate', N'P') IS NOT NULL
DROP PROCEDURE HumanResources.usp_DeleteCandidate;
GO
-- Create the procedure.
CREATE PROCEDURE HumanResources.usp_DeleteCandidate
(
@CandidateID INT
)
AS
-- Execute the DELETE statement.
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = @CandidateID;
-- Test the error value.
IF @@ERROR <> 0
BEGIN
-- Return 99 to the calling program to indicate failure.
PRINT N'An error occurred deleting the candidate information.';
RETURN 99;
END
ELSE
BEGIN
-- Return 0 to the calling program to indicate success.
PRINT N'The job candidate has been deleted.';
RETURN 0;
END;
GO
下面的示例用 @@ERROR 和 @@ROWCOUNT 验证一条 UPDATE 语句的操作。为任何可能出现的错误而检验 @@ERROR 的值,而用 @@ROWCOUNT 保证更新已成功应用于表中的某行。
USE AdventureWorks;
GO
IF OBJECT_ID(N'Purchasing.usp_ChangePurchaseOrderHeader',N'P')IS NOT NULL
DROP PROCEDURE Purchasing.usp_ChangePurchaseOrderHeader;
GO
CREATE PROCEDURE Purchasing.usp_ChangePurchaseOrderHeader
(
@PurchaseOrderID INT
,@EmployeeID INT
)
AS
-- Declare variables used in error checking.
DECLARE @ErrorVar INT;
DECLARE @RowCountVar INT;
-- Execute the UPDATE statement.
UPDATE PurchaseOrderHeader
SET EmployeeID = @EmployeeID
WHERE PurchaseOrderID = @PurchaseOrderID;
-- Save the @@ERROR and @@ROWCOUNT values in local
-- variables before they are cleared.
SELECT @ErrorVar = @@ERROR
,@RowCountVar = @@ROWCOUNT;
-- Check for errors. If an invalid @EmployeeID was specified
-- the UPDATE statement returns a foreign-key violation error #547.
IF @ErrorVar <> 0
BEGIN
IF @ErrorVar = 547
BEGIN
PRINT N'ERROR: Invalid ID specified for new employee.';
RETURN 1;
END
ELSE
BEGIN
PRINT N'ERROR: error '
+ RTRIM(CAST(@ErrorVar AS NVARCHAR(10)))
+ N' occurred.';
RETURN 2;
END
END
-- Check the row count. @RowCountVar is set to 0
-- if an invalid @PurchaseOrderID was specified.
IF @RowCountVar = 0
BEGIN
PRINT 'Warning: The EmployeeID specified is not valid';
RETURN 1;
END
ELSE
BEGIN
PRINT 'Purchase order updated with the new employee';
RETURN 0;
END;
GO
@@FETCH_STATUS
返回针对连接当前打开的任何游标发出的上一条游标 FETCH 语句的状态。
返回类型 integer
返回值 说明
0 FETCH 语句成功。
-1 FETCH 语句失败或行不在结果集中。
-2 提取的行不存在。
由于 @@FETCH_STATUS 对于在一个连接上的所有游标都是全局性的,所以要谨慎使用 @@FETCH_STATUS。在执行一条 FETCH 语句后,必须在对另一游标执行另一 FETCH 语句前测试 @@FETCH_STATUS。在此连接上出现任何提取操作之前,@@FETCH_STATUS 的值没有定义。
例如,用户从一个游标执行一条 FETCH 语句,然后调用一个存储过程,此存储过程打开并处理另一个游标的结果。从被调用的存储过程返回控制后,@@FETCH_STATUS 反映的是在存储过程中执行的最后的 FETCH 语句的结果,而不是在存储过程被调用之前的 FETCH 语句的结果。
以下示例用 @@FETCH_STATUS 控制一个 WHILE 循环中的游标活动。
DECLARE Employee_Cursor CURSOR FOR
SELECT EmployeeID, Title FROM AdventureWorks.HumanResources.Employee;
OPEN Employee_Cursor;
FETCH NEXT FROM Employee_Cursor;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM Employee_Cursor;
END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;
GO
@@IDENTITY
返回最后插入的标识值的系统函数。
返回类型 numeric(38,0)
在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含语句生成的最后一个标识值。如果语句未影响任何包含标识列的表,则 @@IDENTITY 返回 NULL。如果插入了多个行,生成了多个标识值,则 @@IDENTITY 将返回最后生成的标识值。如果语句触发了一个或多个触发器,该触发器又执行了生成标识值的插入操作,那么,在语句执行后立即调用 @@IDENTITY 将返回触发器生成的最后一个标识值。如果对包含标识列的表执行插入操作后触发了触发器,并且触发器对另一个没有标识列的表执行了插入操作,则 @@IDENTITY 将返回第一次插入的标识值。出现 INSERT 或 SELECT INTO 语句失败或大容量复制失败,或者事务被回滚的情况时,@@IDENTITY 值不会恢复为以前的设置。
如果语句和事务失败,它们会更改表的当前标识,从而使标识列中的值出现不连贯现象。即使未提交试图向表中插入值的事务,也永远无法回滚标识值。例如,如果因 IGNORE_DUP_KEY 冲突而导致 INSERT 语句失败,表的当前标识值仍然会增加。
@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 是相似的函数,因为他们都返回插入到表的 IDENTITY 列的最后一个值。
@@IDENTITY 和 SCOPE_IDENTITY 可以返回当前会话中的所有表中生成的最后一个标识值。但是,SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。
IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 可以返回任何会话和任何作用域中为特定表生成的标识值。有关详细信息,请参阅 IDENT_CURRENT (Transact-SQL)。
@@IDENTITY 函数的作用域是执行该函数的本地服务器上的当前会话。此函数不能应用于远程或链接服务器。若要获得其他服务器上的标识值,请在远程服务器或链接服务器上执行存储过程,并使(在远程或链接服务器的环境中执行的)该存储过程收集标识值,并将其返回本地服务器上的发出调用的连接。
以下示例向包含标识列 (LocationID) 的表中插入一行,并使用 @@IDENTITY 显示新行中使用的标识值。
USE AdventureWorks;
GO
--Display the value of LocationID in the last row in the table.
SELECT MAX(LocationID) FROM Production.Location;
GO
INSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate)
VALUES ('Damaged Goods', 5, 2.5, GETDATE());
GO
SELECT @@IDENTITY AS 'Identity';
GO
--Display the value of LocationID of the newly inserted row.
SELECT MAX(LocationID) FROM Production.Location;
GO
@@IDLE
返回 SQL Server 自上次启动后的空闲时间。结果以 CPU 时间增量或“时钟周期”表示,并且是所有 CPU 的累积,因此该值可能超过实际经过的时间。乘以 @@TIMETICKS 即可转换为微秒。
返回类型 integer
以下示例将返回 SQL Server 自启动到当前时间的空闲毫秒数。为了避免将值转换为微秒时出现算术溢出,此示例将其中一个值转换为 float 数据类型。
SELECT @@IDLE * CAST(@@TIMETICKS AS float) AS 'Idle microseconds',
GETDATE() AS 'as of'
Idle microseconds as of
----------------- ----------------------
@@IO_BUSY
返回自从 SQL Server 最近一次启动以来,SQL Server 已经用于执行输入和输出操作的时间。其结果是 CPU 时间增量(时钟周期),并且是所有 CPU 的累积值,所以,它可能超过实际消逝的时间。乘以 @@TIMETICKS 即可转换为微秒。
返回类型 integer
下面的示例返回在开始时间和当前时间之间 SQL Server 已经用于执行输入/输出操作的毫秒数。为了避免将值转换为微秒时出现算术溢出,此示例将其中一个值转换为 float 数据类型。
SELECT @@IO_BUSY*@@TIMETICKS AS 'IO microseconds',
GETDATE() AS 'as of'
IO microseconds as of
--------------- ----------------------
@@LANGID
返回当前使用的语言的本地语言标识符 (ID)。
返回类型 smallint
以下示例将当前会话的语言设置为 Italian,然后使用 @@LANGID 返回意大利语的 ID。
SET LANGUAGE 'Italian'
SELECT @@LANGID AS 'Language ID'
Changed language setting to Italiano.
Language ID
-----------
6
@@LANGUAGE
返回当前所用语言的名称。
返回类型 nvarchar
以下示例返回当前会话的语言。
SELECT @@LANGUAGE AS 'Language Name';
Language Name
------------------------------
us_english
@@LOCK_TIMEOUT
返回当前会话的当前锁定超时设置(毫秒)。
返回类型 integer
SET LOCK_TIMEOUT 允许应用程序设置语句等待阻塞资源的最长时间。当一条语句等待的时间长度超过 LOCK_TIMEOUT 所设置的时间长度时,被锁住的语句将自动取消,并给应用程序返回一条错误消息。
如果当前会话中尚未运行 SET LOCK_TIMEOUT,@@LOCK_TIMEOUT 将返回值 -1。
以下示例显示当未设置 LOCK_TIMEOUT 值时的结果集。
SELECT @@LOCK_TIMEOUT AS [Lock Timeout];
GO
Lock Timeout
------------
-1
该示例将 LOCK_TIMEOUT 设置为 1800 毫秒,然后调用 @@LOCK_TIMEOUT。
SET LOCK_TIMEOUT 1800;
SELECT @@LOCK_TIMEOUT AS [Lock Timeout];
GO
Lock Timeout
------------
1800
@@MAX_CONNECTIONS
返回 SQL Server 实例允许同时进行的最大用户连接数。返回的数值不一定是当前配置的数值。
返回类型 integer
以下示例显示如何返回 SQL Server 实例的最大用户连接数。
SELECT @@MAX_CONNECTIONS AS 'Max Connections'
Max Connections
---------------
32767
@@MAX_PRECISION
按照服务器中的当前设置,返回 decimal 和 numeric 数据类型所用的精度级别。
返回类型 tinyint
默认情况下,最大精度返回 38。
SELECT @@MAX_PRECISION AS 'Max Precision'
@@NESTLEVEL
返回对本地服务器上执行的当前存储过程的嵌套级别(初始值为 0)。
返回类型 int
每次一个存储过程通过引用公共语言运行时 (CLR) 例程、类型或聚合来调用另一个存储过程或执行托管代码时,嵌套级别都会增加。超过最大级数 32 时,事务即被终止。
下示例将创建两个过程:一个过程调用另一个过程,一个过程显示每个过程的 @@NESTLEVEL 设置。
USE AdventureWorks;
GO
IF OBJECT_ID (N'usp_OuterProc', N'P')IS NOT NULL
DROP PROCEDURE usp_OuterProc;
GO
IF OBJECT_ID (N'usp_InnerProc', N'P')IS NOT NULL
DROP PROCEDURE usp_InnerProc;
GO
CREATE PROCEDURE usp_InnerProc AS
SELECT @@NESTLEVEL AS 'Inner Level';
GO
CREATE PROCEDURE usp_OuterProc AS
SELECT @@NESTLEVEL AS 'Outer Level';
EXEC usp_InnerProc;
GO
EXECUTE usp_OuterProc;
GO
Outer Level
-----------
1
Inner Level
-----------
2
@@OPTIONS
返回有关当前 SET 选项的信息。
返回类型 integer
以下示例设置 NOCOUNT ON 并测试 @@OPTIONS 的值。NOCOUNT ON 选项可防止将会话中每一个语句的有关受影响行数的消息发送回请求的客户端。@@OPTIONS 的值设置为 512 (0x0200)。这表示 NOCOUNT 选项。下面的示例测试客户端是否启用了 NOCOUNT 选项。例如,它可以帮助跟踪客户端的性能差异。
SET NOCOUNT ON
IF @@OPTIONS & 512 > 0
RAISERROR ('Current user has SET NOCOUNT turned on.', 1, 1)
@@PACK_RECEIVED
返回 SQL Server 自上次启动后从网络读取的输入数据包数。
返回类型 integer
下面的示例说明了 @@PACK_RECEIVED 的用法
SELECT @@PACK_RECEIVED AS 'Packets Received'
Packets Received
----------------
128
@@PACK_SENT
返回 SQL Server 自上次启动后写入网络的输出数据包个数。
返回类型 integer
下面的示例说明了 @@PACK_SENT 的用法:
SELECT @@PACK_SENT AS 'Pack Sent'
Pack Sent
-----------
291
@@PACKET_ERRORS
返回自上次启动 SQL Server 后,在 SQL Server 连接上发生的网络数据包错误数。
返回类型 integer
下面的示例显示了使用 @@PACKET_ERRORS
SELECT @@PACKET_ERRORS AS 'Packet Errors'
Packet Errors
-------------
0
@@PROCID
返回 Transact-SQL 当前模块的对象标识符 (ID)。Transact-SQL 模块可以是存储过程、用户定义函数或触发器。不能在 CLR 模块或进程内数据访问接口中指定 @@PROCID 。
返回类型 int
以下示例使用 @@PROCID 作为 OBJECT_NAME 函数中的输入参数,在 RAISERROR 消息中返回存储过程的名称
USE AdventureWorks;
GO
IF OBJECT_ID ( 'usp_FindName', 'P' ) IS NOT NULL
DROP PROCEDURE usp_FindName;
GO
CREATE PROCEDURE usp_FindName
@lastname varchar(40) = '%',
@firstname varchar(20) = '%'
AS
DECLARE @Count int;
DECLARE @ProcName nvarchar(128);
SELECT LastName, FirstName, Phone, EmailAddress
FROM Person.Contact
WHERE FirstName LIKE @firstname AND LastName LIKE @lastname;
SET @Count = @@ROWCOUNT;
SET @ProcName = OBJECT_NAME(@@PROCID);
RAISERROR ('Stored procedure %s returned %d rows.', 16,10, @ProcName, @Count);
GO
EXECUTE dbo.usp_FindName 'P%', 'A%';
@@REMSERVER
此功能将删除
@@ROWCOUNT
返回受上一语句影响的行数。如果行数大于 20 亿,请使用 ROWCOUNT_BIG。
返回类型 int
Transact-SQL 语句可以通过下列方式设置 @@ROWCOUNT 的值:
将 @@ROWCOUNT 设置为受影响或被读取的行的数目。可以将行发送到客户端,也可以不发送。
保留前一个语句执行中的 @@ROWCOUNT。
将 @@ROWCOUNT 重置为 0 但不将该值返回到客户端。
执行简单分配的语句始终将 @@ROWCOUNT 值设置为 1。不将任何行发送到客户端。这些语句的示例如下:SET @local_variable、RETURN、READTEXT 以及不带查询 Select 语句,如 SELECT GETDATE() 或 SELECT 'Generic Text'。
在查询中执行分配或使用 RETURN 的语句将 @@ROWCOUNT 值设置为受查询影响或由查询读取的行数,例如:SELECT @local_variable = c1 FROM t1。
数据操作语言 (DML) 语句将 @@ROWCOUNT 值设置为受查询影响的行数,并将该值返回到客户端。DML 语句不会将任何行发送到客户端。
DECLARE CURSOR 和 FETCH 将 @@ROWCOUNT 值设置为 1。
EXECUTE 语句保留前一个 @@ROWCOUNT。
USE、SET
、DEALLOCATE CURSOR、CLOSE CURSOR、BEGIN TRANSACTION 或 COMMIT TRANSACTION 等语句将 ROWCOUNT 值重置为 0。
USE AdventureWorks;
GO
UPDATE HumanResources.Employee
SET Title = N'Executive'
WHERE NationalIDNumber = 123456789
IF @@ROWCOUNT = 0
PRINT 'Warning: No rows were updated';
GO
@@SERVERNAME
返回运行 SQL Server 的本地服务器的名称。
返回类型 nvarchar
SQL Server 安装程序在安装时将服务器名设置为计算机名。若要更改服务器的名称,请使用 sp_addserver,然后重新启动 SQL Server。
安装了多个 SQL Server 实例时,如果本地服务器名自安装后未发生更改,则 @@SERVERNAME 返回以下本地服务器名信息。
实例 服务器信息
默认实例 'servername'
命名实例 'servername\instancename'
故障转移群集实例 - 默认实例 'virtualservername'
故障转移群集实例 - 命名实例 'virtualservername\instancename'
尽管 @@SERVERNAME 函数和 SERVERPROPERTY 函数的 SERVERNAME 属性可能返回相似格式的字符串,但信息会有所不同。SERVERNAME 属性自动报告计算机网络名的更改。
相比之下,@@SERVERNAME 不报告此更改。@@SERVERNAME 报告使用 sp_addserver 或 sp_dropserver 存储过程对本地服务器名所做的更改。
SELECT @@SERVERNAME AS 'Server Name'
Server Name
---------------------------------
ACCTG
@@SERVICENAME
返回 SQL Server 正在其下运行的注册表项的名称。若当前实例为默认实例,则 @@SERVICENAME 返回 MSSQLSERVER;若当前实例是命名实例,则该函数返回该实例名。
返回类型 nvarchar
SELECT @@SERVICENAME AS 'Service Name'
Service Name
------------------------------
MSSQLSERVER
@@SPID
返回当前用户进程的会话 ID。
返回类型 smallint
SELECT @@SPID AS 'ID', SYSTEM_USER AS 'Login Name', USER AS 'User Name'
ID Login Name User Name
------ ------------------------------ ------------------------------
@@TEXTSIZE
返回 TEXTSIZE 选项的当前值。
返回类型 integer
以下示例使用 SELECT 语句来显示使用 SET TEXTSIZE 语句更改前后的 @@TEXTSIZE 值
-- Set the TEXTSIZE option to the default size of 4096 bytes.
SET TEXTSIZE 0
SELECT @@TEXTSIZE AS 'Text Size'
SET TEXTSIZE 2048
SELECT @@TEXTSIZE AS 'Text Size'
Text Size
-----------
4096
Text Size
-----------
@@TIMETICKS
返回每个时钟周期的微秒数。
返回类型 integer
每个时钟周期的时间量依赖于计算机。操作系统的一个时钟周期是 31.25 毫秒,或是三十分之一秒。
@@TOTAL_ERRORS
返回自上次启动 SQL Server 之后 SQL Server 所遇到的磁盘写入错误数。
返回类型 integer
@@TOTAL_READ
返回 SQL Server 自上次启动后由 SQL Server 读取(非缓存读取)的磁盘的数目。
返回类型 integer
SELECT @@TOTAL_READ AS 'Reads', @@TOTAL_WRITE AS 'Writes', GETDATE() AS 'As of'
Reads Writes As of
----------- ----------- ----------------------
@@TOTAL_WRITE
返回自上次启动 SQL Server 以来 SQL Server 所执行的磁盘写入数。
返回类型 integer
SELECT @@TOTAL_READ AS 'Reads', @@TOTAL_WRITE AS 'Writes', GETDATE() AS 'As of'
Reads Writes As of
----------- ----------- ----------------------
@@TRANCOUNT
返回当前连接的活动事务数。
返回类型 integer
BEGIN TRANSACTION 语句将 @@TRANCOUNT 加 1。ROLLBACK TRANSACTION 将 @@TRANCOUNT 递减到 0,但 ROLLBACK TRANSACTION savepoint_name 除外,它不影响 @@TRANCOUNT。COMMIT TRANSACTION 或 COMMIT WORK 将 @@TRANCOUNT 递减 1。
下面的示例演示嵌套的 BEGIN 和 COMMIT 语句对 @@TRANCOUNT 变量产生的效果
PRINT @@TRANCOUNT
-- The BEGIN TRAN statement will increment the
-- transaction count by 1.
BEGIN TRAN
PRINT @@TRANCOUNT
BEGIN TRAN
PRINT @@TRANCOUNT
-- The COMMIT statement will decrement the transaction count by 1.
COMMIT
PRINT @@TRANCOUNT
COMMIT
PRINT @@TRANCOUNT
--Results
--0
--1
--2
--1
--0
下面的示例演示嵌套的 BEGIN TRAN 和 ROLLBACK 语句对 @@TRANCOUNT 变量产生的效果
PRINT @@TRANCOUNT
-- The BEGIN TRAN statement will increment the
-- transaction count by 1.
BEGIN TRAN
PRINT @@TRANCOUNT
BEGIN TRAN
PRINT @@TRANCOUNT
-- The ROLLBACK statement will clear the @@TRANCOUNT variable
-- to 0 because all active transactions will be rolled back.
ROLLBACK
PRINT @@TRANCOUNT
--Results
--0
--1
--2
--0
@@VERSION
返回当前的 SQL Server 安装的版本、处理器体系结构、生成日期和操作系统
返回类型 nvarchar
不喜勿喷