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

SQL Server 實用腳本大全:查詢、字串、日期、分頁與系統管理

     編輯:關於SqlServer

整理自實戰專案的高頻 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;

分頁查詢(SQL 2005+ 推薦 ROW_NUMBER)

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.VIEWS
  • 判斷資料庫存在:IF EXISTS(SELECT 1 FROM sys.databases WHERE name='DBName')
  • 判斷暫存表存在:IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL
  • 判斷 Agent 作業存在:IF 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 執行測試。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved