針對 SQL Server 2000 初學者與開發人員最常遇到的 21 個實務問題,提供標準解法、原理解析與最佳實踐建議。
問題:如何啟用 Windows 整合驗證?
解法:企業管理器 → 右鍵伺服器 → 內容 → 安全性 → 選擇「Windows 僅限」或「SQL Server 和 Windows」模式。修改後需重啟 MSSQLServer 服務生效。
問題:如何啟用/手動執行資料庫收縮?
解法:
警告:生產環境不建議啟用自動收縮,會造成索引碎片化、效能抖動。建議排程重建索引 + 手動收縮。
| 寫法 | 適用場景 | 索引利用 | 效能 |
|---|---|---|---|
WHERE Name = '張三' | 精確比對 | 可用索引 Seek | 最佳 |
WHERE Name LIKE '張%' | 前綴比對 | 可用索引 Seek | 良好 |
WHERE Name LIKE '%三' | 後綴/中間比對 | 索引掃描/全表掃描 | 差 |
| 類型 | 格式 | 範例 |
|---|---|---|
| 本機預設實體 | (local) / . / 127.0.0.1 / localhost | . |
| 本機具名實體 | .\實體名稱 | .\SQLEXPRESS |
| 遠端伺服器 | IP位址 / 主機名稱 / 主機名稱\實體名稱 | 192.168.1.100 / DB-SERVER\PROD |
| 特性 | TRUNCATE TABLE | DELETE |
|---|---|---|
| 記錄寫入 | 最小記錄 (僅頁釋放) | 完整記錄每列刪除 |
| 觸發器 | 不觸發 | 觸發 AFTER DELETE |
| 身分識別欄位 | 重置為種子值 | 保留現值 |
| 外鍵限制 | 不可有參考此表的 FK | 檢查 FK 限制 |
| 回復速度 | 極快 | 較慢 |
-- 方法 1: UNION ALL (適用於少量固定值)
INSERT INTO Target (Col1, Col2)
SELECT 'A', 1 UNION ALL SELECT 'B', 2 UNION ALL SELECT 'C', 3;
-- 方法 2: 從來源表選取 (大量資料)
INSERT INTO Target (Col1, Col2)
SELECT ColA, ColB FROM Source WHERE Condition = 'X';
-- 注意: DEFAULT 關鍵字僅在單列 INSERT VALUES 中有效
SELECT Col1, Col2, Col3
INTO NewTable
FROM SourceTable
WHERE Condition = 'Y';
-- 新表不可預先存在,結構與查詢結果一致,無索引/限制/觸發器
兩表查詢同名欄位 (如 SELECT A.ID, B.ID FROM A, B) 會產生兩個同名欄位,不會自動合併。若需合併需使用 COALESCE 或 ISNULL 明確處理。
原因:交易回滾、刪除資料、伺服器重啟皆會造成間隙。
修正:暫停身分識別插入 → 手動補齊 → 恢復身分識別:
SET IDENTITY_INSERT TableName ON;
INSERT INTO TableName (ID, Col) VALUES (5, 'Data'); -- 手動指定 ID
SET IDENTITY_INSERT TableName OFF;
DBCC CHECKIDENT ('TableName', RESEED, 5); -- 重置種子
原因:現有資料違反新限制 (如 NULL 值違反 NOT NULL、重複值違反 UNIQUE)。
解法:先清理資料再建立限制,或建立 WITH NOCHECK 後再驗證。
檢查登入屬性 → 資料庫存取頁:目標資料庫是否勾選?角色頁:是否指派 db_owner、db_datareader 等角色 (而非僅 public)?
安全格式 (不受語言/日期格式設定影響):
'YYYYMMDD' (如 '20241225')
'YYYY-MM-DDTHH:MM:SS' (ISO 8601,如 '2024-12-25T14:30:00')
避免使用:'MM/DD/YYYY'、'DD/MM/YYYY'、'YYYY/MM/DD' 等模稜兩可格式。
SUM、AVG、COUNT(欄位)、MIN/MAX 皆忽略 NULL 值。
COUNT(*) 計算列數包含 NULL 列。
AVG 分母為非 NULL 列數。
欄位定義 DEFAULT 'N/A' 時:
INSERT INTO T (Col) VALUES (DEFAULT) → 寫入 'N/A'
INSERT INTO T (Col) VALUES (NULL) → 寫入 NULL (若允許)
INSERT INTO T DEFAULT VALUES → 所有欄位用預設值
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += 'DROP TABLE [' + SCHEMA_NAME(schema_id) + '].[' + name + ']; '
FROM sys.objects WHERE type = 'U';
EXEC sp_executesql @sql;
-- 注意: 有外鍵關聯時需先刪除 FK,可查詢 sys.foreign_keys 產生 ALTER TABLE DROP CONSTRAINT 腳本