# 有哪些SQLServer变量相关知识 ## 一、变量的基本概念 SQL Server中的变量是用于临时存储数据的对象,主要分为两大类: 1. **局部变量**:以`@`符号开头,作用域限于声明它的批处理、存储过程或函数 2. **全局变量**:以`@@`符号开头,由系统预定义,用于返回服务器配置和状态信息 ```sql -- 局部变量声明示例 DECLARE @EmployeeName VARCHAR(50) DECLARE @Salary DECIMAL(10,2) = 5000.00 -- 全局变量使用示例 SELECT @@VERSION AS SQLServerVersion
DECLARE @VariableName DataType [= InitialValue]
支持同时声明多个同类型变量:
DECLARE @StartDate DATE, @EndDate DATE = '2023-12-31'
SET语句(推荐用于标量赋值):
SET @VariableName = Value
SELECT语句(可从查询结果赋值):
SELECT @VariableName = ColumnName FROM Table WHERE...
重要区别: - SET:一次只能给一个变量赋值 - SELECT:可从单行结果集中赋值多个变量
-- 示例:作用域演示 BEGIN DECLARE @InnerVar INT = 10 PRINT '内部变量值: ' + CAST(@InnerVar AS VARCHAR) END -- 此处@InnerVar已超出作用域
变量名 | 说明 |
---|---|
@@ROWCOUNT | 返回受上一语句影响的行数 |
@@ERROR | 返回最后执行的T-SQL语句的错误号 |
@@IDENTITY | 返回最后插入的标识值 |
@@TRANCOUNT | 返回当前连接的活动事务数 |
@@SPID | 返回当前用户进程的服务器进程ID |
@@SERVERNAME | 返回运行SQL Server的本地服务器名称 |
-- 实用示例:获取插入后的ID INSERT INTO Employees(Name) VALUES('张三') SELECT @@IDENTITY AS NewEmployeeID
DECLARE @EmployeeTable TABLE ( ID INT, Name NVARCHAR(50), HireDate DATE )
特点: - 仅存在于内存中(通常) - 不产生事务日志 - 无统计信息,优化器总是假定只有1行
CREATE TABLE #TempEmployees ( ID INT, DeptName VARCHAR(50) )
对比差异:
特性 | 表变量 | 临时表 |
---|---|---|
作用域 | 当前批处理 | 当前会话 |
统计信息 | 无 | 有 |
事务 | 仅当前语句 | 完整事务支持 |
索引 | 有限支持 | 完整支持 |
DECLARE @SQL NVARCHAR(MAX) DECLARE @TableName NVARCHAR(50) = 'Employees' SET @SQL = N'SELECT * FROM ' + QUOTENAME(@TableName) EXEC sp_executesql @SQL
安全注意事项: - 始终使用QUOTENAME()
防止SQL注入 - 参数化动态SQL更安全:
DECLARE @Filter NVARCHAR(50) = 'Sales%' EXEC sp_executesql N'SELECT * FROM Employees WHERE Dept LIKE @DeptFilter', N'@DeptFilter NVARCHAR(50)', @DeptFilter = @Filter
命名规范:
初始化习惯:
DECLARE @Count INT = 0 -- 明确初始化
数据类型选择:
错误处理:
BEGIN TRY SET @Result = 10 / @Denominator END TRY BEGIN CATCH SET @Result = NULL END CATCH
DECLARE @PageSize INT = 10, @PageNum INT = 2 SELECT * FROM ( SELECT ROW_NUMBER() OVER(ORDER BY ID) AS RowNum, * FROM Products ) AS T WHERE RowNum BETWEEN (@PageNum-1)*@PageSize+1 AND @PageNum*@PageSize
DECLARE @DebugMode BIT = 1 IF @DebugMode = 1 BEGIN PRINT '调试信息: ' + @VariableValue END
DECLARE @CursorVar CURSOR SET @CursorVar = CURSOR FOR SELECT Name FROM Departments OPEN @CursorVar -- ...处理游标... CLOSE @CursorVar DEALLOCATE @CursorVar
Q:变量能存储多少数据? A:取决于数据类型,VARCHAR(MAX)可达2GB
Q:为什么我的变量赋值后显示NULL? A:检查SELECT赋值是否返回了结果集,无结果时变量保持原值
Q:如何在存储过程间传递变量? A:通过参数传递,不是直接共享变量
Q:表变量性能一定优于临时表吗? A:不一定,数据量大时临时表可能更优
通过掌握这些变量知识,可以显著提升T-SQL编程的灵活性和效率。实际开发中应根据具体场景选择最合适的变量使用方式。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。