# 有哪些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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。