SQL Server 2005 引入了多項實用的 T-SQL 新特性,本文透過建立測試表與資料,示範如何利用新語法刪除重複列、隨機取樣、實現高效分頁,並查詢伺服器版本資訊。
CREATE TABLE TestTable (
Column1 VARCHAR(1),
Column2 INT
);
INSERT INTO TestTable VALUES ('A', 1);
INSERT INTO TestTable VALUES ('A', 1); -- 重複
INSERT INTO TestTable VALUES ('A', 2);
INSERT INTO TestTable VALUES ('B', 1);
INSERT INTO TestTable VALUES ('B', 2);
INSERT INTO TestTable VALUES ('B', 2); -- 重複
INSERT INTO TestTable VALUES ('C', 2);
%%lockres%% 為內部虛擬欄位,代表資源鎖定標識,可用於識別唯一資料列。
DELETE FROM TestTable
WHERE TestTable.%%lockres%% NOT IN (
SELECT MIN(b.%%lockres%%)
FROM TestTable b
GROUP BY b.Column1, b.Column2
);
SQL Server 2008 引入 %%physloc%% 取代 %%lockres%%,用法相同。
DELETE FROM TestTable
WHERE TestTable.%%physloc%% NOT IN (
SELECT MIN(b.%%physloc%%)
FROM TestTable b
GROUP BY b.Column1, b.Column2
);
若資料表有自增主鍵,可用 MIN(ID) 分組取得唯一列。
-- 加入主鍵
ALTER TABLE TestTable WITH NOCHECK ADD
ID INT IDENTITY(1,1) PRIMARY KEY;
GO
-- 取唯一記錄
SELECT MIN(ID)
FROM TestTable
GROUP BY Column1, Column2;
GO
SELECT TOP 3 *
FROM TestTable
ORDER BY NEWID();
每次執行會隨機返回 3 筆不同記錄,適合抽樣測試。
SELECT *
FROM (
SELECT
ID, Column1, Column2,
ROW_NUMBER() OVER (ORDER BY ID DESC) AS RowNum
FROM TestTable
) AS a
WHERE RowNum BETWEEN 1 AND 3;
ROW_NUMBER() 配合 OVER 子句,是 SQL Server 2005 後分頁的標準寫法,效能遠優於舊式 TOP 巢狀查詢。
SELECT
SERVERPROPERTY('ProductVersion') AS Version,
SERVERPROPERTY('ProductLevel') AS Level,
SERVERPROPERTY('Edition') AS Edition;
常見版本號對照:


善用 SQL Server 2005 的新函數與虛擬欄位,能簡化重複資料清理、隨機抽樣與分頁查詢等常見任務,提升開發效率與查詢效能。