Sql Server系列:Transact-SQL变量
变量是Transact-SQL中由用户定义、可对其赋值并参与运算的一个实体,分为全局变量和局部变量。其中全局变量由系统自定义并维护,全局变量名称前面有@@字符,任何程序均可随时调用。局部变量名称前面有一个@,由用户定义和使用。
1 局部变量
局部变量一般出现在批处理、存储过程和触发器中,如果要使用局部变量,必须在使用前以DECLARE语句定义。局部变量仅存在于声明它的批处理、存储过程或触发器中,处理结束后,存储在局部变量中的信息将丢失。
1.1 局部变量声明
在使用DECLARE语句来声明局部变量时,必须提供变量名称及数据类型,变量名称前面必须有一个@字符,变量名称最大长度为30个字符。声明变量时可以使用任何系统定义的数据类型或用户自定义的数据类型。
DECLARE语法:
DECLARE { @variable_name datatype | [= value]} [,...n]
参数:
◊ @variable_name:变量的名称。变量名必须以@开头。
◊ datatype:任何由系统提供的或用户定义的数据类型。变量数据类型不能是text、ntext或image。
在SQL Server中,一次可以定义多个变量。
DECLARE @Name VARCHAR(50), @Age INT = 20
1.2 局部变量赋值
变量声明后,变量值被默认设置为NULL。可以使用SET或SELECT语句为变量赋值,SET是为变量赋值的首选方法。
语法格式:
SET @variable_name = expression
SELECT @variable_name = expression
示例:
DECLARE @Name VARCHAR(50), @Age INT SET @Name = 'Test' SELECT @Age = 20 SELECT @Name, @Age
DECLARE @TotalRecords INT SET @TotalRecords = (SELECT COUNT(1) FROM [dbo].[Product]) SELECT @TotalRecords = COUNT(1) FROM [dbo].[Product] SELECT @TotalRecords
在局部变量没有被赋值之前,其值是NULL,如果要引用,特别是在循环结构中引用,必须先为其赋值。
DECLARE @Counter INT SET @Counter = 1 WHILE @Counter <= 10 BEGIN PRINT @Counter SET @Counter = @Counter + 1 -- SELECT @Counter = @Counter + 1 END
在SELECT语句的WHERE字句中使用变量:
DECLARE @ProductID INT SET @ProductID = 1 SELECT * FROM [dbo].[Product] WHERE [ProductID] = @ProductID
变量可以通过选择列表中当前所引用的值赋值,如果在选择列中引用变量,变量应被赋以标量值或者SELECT语句应仅返回一行。
DECLARE @MaxQuantity INT SET @MaxQuantity = (SELECT MAX([Quantity]) FROM [dbo].[Product]) SELECT @MaxQuantity
DECLARE @MaxQuantity INT SELECT @MaxQuantity = MAX([Quantity]) FROM [dbo].[Product] SELECT @MaxQuantity
如果SELECT语句返回多行而且变量引用一个非标量表达式,则变量被赋予为结果集最后一行中表达式的返回值。
DECLARE @ProductID INT SELECT @ProductID = [ProductID] FROM [dbo].[Product] SELECT @ProductID
测试[dbo].[Product]表中有5条记录,执行结果为:5
DECLARE @ProductIDs VARCHAR(100) SET @ProductIDs = '' SELECT @ProductIDs += CONVERT(VARCHAR,[ProductID]) + ',' FROM [dbo].[Product] SELECT @ProductIDs
执行结果为:1,2,3,4,5,
1.3 Table类型变量
Table类型的变量可以作为保存数据的临时表。
DECLARE @MyProduct TABLE ( ProductID INT, ProductName VARCHAR(100) ); INSERT INTO @MyProduct SELECT [ProductID], [ProductName] FROM [dbo].[Product] WHERE [UnitPrict] >= 10; SELECT * FROM @MyProduct;
2 全局变量
全局变量用来跟踪服务器范围和特定会话期间的信息,不能显式被赋值。全局变量不能由用户定义。