首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 預存程序進階 (二):資料類型、變數與表值變數詳解

     編輯:關於SqlServer

字元字串類型

類型最大長度儲存特性適用場景
char(n)8,000固定長度,不足右補空格固定代碼 (身分證、國碼)
varchar(n)8,000變動長度,實際長度+2 bytes一般文字、可變欄位
text2 GBLOB 儲存,已淘汰舊版大型文本 (新版用 varchar(MAX))

Unicode 字元字串類型

類型最大長度儲存特性前綴
nchar(n)4,000固定長度,雙位元組N'字串'
nvarchar(n)4,000變動長度,雙位元組N'字串'
ntext1 GBLOB 儲存,已淘汰N'字串'

常數寫法:VALUES (N'中文'),前綴 N 表示 Unicode。

日期時間類型

類型儲存大小精度範圍
datetime8 bytes3.33 ms1753-01-01 ~ 9999-12-31
smalldatetime4 bytes1 分鐘1900-01-01 ~ 2079-06-06

常數格式:SET @Date = '1983-02-21 10:10 AM' (建議使用 ISO 8601: 'YYYY-MM-DDTHH:MM:SS')。

數值類型

分類類型說明
整數bigint8 bytes, -2^63~2^63-1
int4 bytes, -2^31~2^31-1 (最常用)
smallint2 bytes, -32,768~32,767
tinyint1 byte, 0~255
bit1 bit, 0/1/NULL
近似數值float(n)雙精度,15 位有效數字,避免用 = 比較
real單精度,7 位有效數字
精確數值decimal(p,s)p=精度(1~38), s=小數位,金融必用
numericdecimal 同義字

特殊類型:sql_variant

  • 可儲存除 text, ntext, image, timestamp, sql_variant 外的任何類型。
  • 限制:索引鍵長度 < 900 bytes;不可為 IDENTITY/計算欄位;不支援 LIKE、全文索引、+ 串聯、部分彙總函數 (AVG, SUM 等)。

變數類型

區域變數

DECLARE @LastName NVARCHAR(50), @FirstName NVARCHAR(30);
  • 以 @ 開頭,批次/預存程序/函數內有效。
  • 賦值:SET @Var = 值 或 SELECT @Var = 欄位 FROM 表。

全域變數 (系統函數)

變數說明
@@IDENTITY目前工作階段、任何作用域最後產生的識別值 (含觸發器產生的)
SCOPE_IDENTITY()目前工作階段、**目前作用域**最後產生的識別值 (推薦使用)
IDENT_CURRENT('Table')指定資料表、任何工作階段/作用域最後產生的識別值
@@ERROR上一條陳述式錯誤碼 (0=成功)
@@ROWCOUNT上一條陳述式影響的列數

表值變數 (Table Variable)

DECLARE @Tbl TABLE (
    ID INT PRIMARY KEY,
    Name NVARCHAR(50) NOT NULL,
    CreatedDate DATETIME DEFAULT GETDATE()
);

優點

  • 行為像區域變數,作用域明確,批次/SP 結束自動清除。
  • 可用於 SELECT/INSERT/UPDATE/DELETE,像一般資料表。
  • 減少預存程序重新編譯 (Recompile)。
  • 交易僅在更新期間存在,降低鎖定/記錄資源需求。

限制

  • 不可用於 SELECT ... INTO @Tbl。
  • CHECK/DEFAULT/計算欄位不可呼叫使用者定義函數。
  • 無統計資料,查詢最佳化器假設 1 列,大量資料效能可能較差 (建議 < 1000 列使用)。
  • 不可建立非叢集索引 (SQL 2014+ 可透過 PRIMARY KEY/UNIQUE 隱含建立)。

臨時表 vs. 表值變數 選擇指南

情境建議
資料量大、需索引、統計資料、跨 SP 共用臨時表 (#TempTable)
小量資料、僅目前 SP 使用、避免重編譯表值變數 (@TblVar)
需動態 DDL (ALTER TABLE 加欄位)臨時表
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved