判斷運算式是否為有效數值型別 (int、money、float 等),回傳 1 或 0。
-- 查詢非數值資料列
SELECT * FROM tablename WHERE ISNUMERIC(columnname) <> 1;
驗證運算式是否為有效 date、time 或 datetime 值。
IF ISDATE('2009-05-12 10:19:41.177') = 1
PRINT '有效日期';
ELSE
PRINT '無效日期';
回傳模式首次出現的起始位置,支援萬用字元,比 CHARINDEX 更強大。
-- 基本用法
SELECT PATINDEX('%BB%', 'AA_BB_CC_DD'); -- 回傳 4
-- 進階:搜尋數字後接大寫字母
SELECT PATINDEX('%[0-9][A-Z]%', 'AA_BB_9C_DD'); -- 回傳 7
SELECT CHARINDEX('%[0-9][A-Z]%', 'AA_BB_9C_DD'); -- 回傳 0 (不支援萬用字元)
產生 uniqueidentifier 型別的全域唯一值,無規律且不重複。
DECLARE @myid UNIQUEIDENTIFIER;
SET @myid = NEWID();
PRINT @myid; -- 範例: 0B939411-4827-485E-884B-5BEB1699CFEE
控制字串比較、排序規則,支援中文筆畫、拼音、區分大小寫/腔調等。
-- 建立測試資料
CREATE TABLE #tempTalbe (_id INT, _name VARCHAR(30));
INSERT INTO #tempTalbe VALUES (1,'中'),(2,'國'),(3,'人');
-- 拉丁文定序 (預設)
SELECT * FROM #tempTalbe ORDER BY _name COLLATE Latin1_General_CS_AS_KS_WS ASC;
-- 結果: 中、國、人
-- 中文繁體筆畫定序
SELECT * FROM #tempTalbe ORDER BY _name COLLATE Chinese_Taiwan_Stroke_CS_AS_KS_WS ASC;
-- 結果: 依筆畫排序
-- 查詢所有可用定序
SELECT * FROM fn_helpcollations();
優於 EXECUTE:支援參數替換、執行計畫重用、效能更佳。
DECLARE @tbname NVARCHAR(20) = '#tb_suer';
DECLARE @sql NVARCHAR(500) = 'SELECT * FROM ' + @tbname;
EXEC sp_executesql @sql;
計算資料列或運算式的校驗和,常用於雜湊索引、資料比對。
-- 找出 T1 有但 T 沒有的資料列 (整列比對)
SELECT * FROM t1
WHERE CHECKSUM(*) NOT IN (SELECT CHECKSUM(*) FROM t);
| 需求 | 推薦函數 | 關鍵特性 |
|---|---|---|
| 驗證純數字 | ISNUMERIC | 包含 money、float 等數值型別 |
| 驗證日期格式 | ISDATE | 支援 date/time/datetime |
| 模糊搜尋/正則模式 | PATINDEX | 支援萬用字元、字元類別 [] |
| 產生唯一識別碼 | NEWID | GUID、全域唯一 |
| 自訂排序規則 | COLLATE | 中文筆畫/拼音、大小寫敏感度 |
| 動態 SQL 執行 | SP_EXECUTESQL | 參數化、計畫重用、防注入 |
| 快速資料比對 | CHECKSUM | 雜湊值、整列比較 |