資料導入不是「一次到位」,而是分層驗證、逐步修正的管線作業。任何跳過暫存階段、直接寫入正式表的操作,都是技術債的來源。
VARCHAR(MAX) / NVARCHAR(MAX),接受任何髒資料(非數字塞進數值欄、超長字串、編碼亂碼)。BULK INSERT、bcp、SSIS 平面檔案來源、或 OPENROWSET 直接導入,不做任何轉換。stg_<來源系統>_<實體>_<YYYYMMDD>,欄位名保留原始名稱(含空格/特殊字元),必要時用 [] 括住。tmp_<實體>),欄位型別、長度、NULL/NOT NULL、DEFAULT、CHECK、PK/FK 全部對齊。INSERT INTO tmp_... SELECT ... FROM stg_...,在 SELECT 列清單中進行:-- 範例:地址拆分、型別轉換、預設值填補
SELECT
TRY_CAST(REPLACE(raw_id, 'ID-', '') AS INT) AS Id,
LTRIM(RTRIM(raw_name)) AS Name,
CASE WHEN TRY_CAST(raw_amt AS DECIMAL(18,2)) IS NULL THEN 0 ELSE TRY_CAST(raw_amt AS DECIMAL(18,2)) END AS Amount,
COALESCE(NULLIF(raw_date, ''), '1900-01-01') AS CreatedDate,
UPPER(LEFT(raw_status, 1)) AS StatusCode
FROM stg_source;
TRY_CAST/NULLIF 捕獲而非中斷批次。dbo_<實體>_shadow,保留所有約束(PK、FK、CK、DEFAULT、NOT NULL)。INSERT INTO dbo_... SELECT * FROM tmp_...,觀察錯誤訊息:DISABLE CONSTRAINT 逐條件啟用定位問題列。BEGIN TRAN;
-- 可選:切換分區/切換表、或 TRUNCATE 正式表
INSERT INTO dbo.<實體> SELECT * FROM tmp_<實體>;
-- 或 MERGE 進行 UPSERT
COMMIT TRAN;
sp_updatestats、DBCC UPDATEUSAGE、重建碎片索引。| 項目 | 規範 | 違例後果 |
|---|---|---|
| 暫存表/欄位名 | 僅英數字 + 底線,無空格/關鍵字 | 須到處加 [],可讀性差、易誤寫 |
| 關鍵字作欄位名 | 嚴禁(如 KEY, ORDER, GROUP) | 查詢需括號,動態 SQL 極易注入/語法錯誤 |
| 原始資料型別 | 統一 VARCHAR/NVARCHAR | 轉換溢位導致批次失敗、資料遺失 |
| 約束驗證環境 | 正式表結構副本(含所有約束) | 測試通過但正式環境因約束差異報錯 |
「慢工出細活」:多花 30% 時間建立分層暫存與驗證管線,能省下 90% 的上線後火場修復成本。這份行為規範適用於 SQL Server 7.0 至最新版,亦可推廣至異構資料庫遷移專案。