整理自實戰專案的高頻 T-SQL 片段,涵蓋排序規則、索引提示、字串操作、日期運算、分頁查詢、系統物件查詢、遠端連結伺服器等場景,適合開發與 DBA 日常參考。所有腳本均在 SQL Server 2008+ 驗證可用。
-- 依姓氏筆畫少到多
SELECT * FROM TableName ORDER BY CustomerName COLLATE Chinese_PRC_Stroke_CI_AS;
SELECT id FROM table_name WITH (INDEX(index_name)) WHERE num = @num;
-- 避免 LIKE '%abc%' 全表掃描
SELECT id FROM t WHERE CHARINDEX('abc', col_name) > 0;
EXEC sp_helptext 'procedure_name';
| 需求 | 函數/寫法 | 範例結果 |
|---|---|---|
| 重複字串 | REPLICATE('K',5) | KKKKK |
| 統計中文字數 | DATALENGTH(N'kk中國123')-LEN(N'kk中國123') | 2 |
| NULLIF 比較 | NULLIF('kk','kk') | NULL |
| ISNULL 取代 | ISNULL(NULL,'kk') | kk |
| COALESCE 多值 | COALESCE(NULL,NULL,'kk','中國') | kk |
| CEILING 向上取整 | CEILING(12.2) | 13 |
| FLOOR 向下取整 | FLOOR(12.7) | 12 |
| ROUND 四捨五入 | ROUND(12.77,0) | 13.00 |
| STUFF 位置替換 | STUFF('ABCDEFG',2,1,'b') | AbCDEFG |
| REPLACE 全部替換 | REPLACE('ABCDEFG','B','b') | AbCDEFG |
| CHARINDEX 判斷存在 | CHARINDEX('1','123145') | 1 |
| PATINDEX 模式比對 | PATINDEX('%[js]%','hsdjg') | 4 |
-- 當前日期加一個月
SELECT DATEADD(MONTH,1,GETDATE());
-- 本月第一天
SELECT DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0);
-- 本月最後一天
SELECT DATEADD(DAY,-1,DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE())+1,0));
-- 本季第一天
SELECT DATEADD(QUARTER,DATEDIFF(QUARTER,0,GETDATE()),0);
-- 本年最後一天(精確到毫秒)
SELECT DATEADD(MS,-3,DATEADD(YEAR,DATEDIFF(YEAR,0,GETDATE())+1,0));
-- 判斷閏年
SELECT CASE WHEN DAY(DATEADD(DAY,-1,DATEADD(MONTH,2,DATEADD(YEAR,DATEDIFF(YEAR,0,GETDATE()),0))))=29 THEN N'閏年' ELSE N'平年' END;
DECLARE @PageIndex INT = 2, @PageSize INT = 20;
WITH CTE AS (
SELECT *, ROW_NUMBER() OVER (ORDER BY CreateDate DESC) AS RN
FROM Orders WHERE Status = 1
)
SELECT * FROM CTE WHERE RN BETWEEN (@PageIndex-1)*@PageSize+1 AND @PageIndex*@PageSize;
SELECT name FROM sys.objects WHERE type='U'SELECT name FROM sys.columns WHERE object_id=OBJECT_ID('TableName')SELECT * FROM INFORMATION_SCHEMA.VIEWSIF EXISTS(SELECT 1 FROM sys.databases WHERE name='DBName')IF OBJECT_ID('tempdb..#TempTable') IS NOT NULLIF EXISTS(SELECT 1 FROM msdb.dbo.sysjobs WHERE name='JobName')-- 1. Linked Server(永久)
EXEC sp_addlinkedserver 'LNK','','SQLOLEDB','RemoteIP';
EXEC sp_addlinkedsrvlogin 'LNK','false',null,'usr','pwd';
SELECT * FROM LNK.DBName.dbo.TableName;
-- 2. OPENROWSET(臨時、單次)
SELECT * FROM OPENROWSET('SQLOLEDB','RemoteIP';'usr';'pwd',DBName.dbo.TableName);
-- 3. OPENDATASOURCE(臨時、單次)
SELECT * FROM OPENDATASOURCE('SQLOLEDB','Data Source=RemoteIP;User ID=usr;Password=pwd').DBName.dbo.TableName;
-- 4. OPENQUERY(需 Linked Server)
SELECT * FROM OPENQUERY(LNK,'SELECT * FROM DBName.dbo.TableName');
DBCC FREEPROCCACHE; -- 清除計畫快取
DBCC DROPCLEANBUFFERS; -- 清除資料快取(僅測試環境)
SET STATISTICS IO, TIME ON; -- 開啟統計
-- 執行查詢
SET STATISTICS IO, TIME OFF; -- 關閉統計
DECLARE @t TABLE (DB sysname, Tab sysname);
INSERT @t EXEC sp_msforeachdb 'SELECT ''?'', name FROM [?].sys.objects WHERE type=''U'' AND name=''TargetTable''';
SELECT * FROM @t;
備註:文中程式碼已去重、修正語法錯誤(如中文標點轉半形),可直接複製至 SSMS 執行測試。