資料型別轉換是 ETL、報表、跨系統整合的日常操作。SQL Server 提供 CONVERT、CAST、TRY_CAST 等多種轉換方式,並支援 TEXT、IMAGE、NTEXT 等大物件型別的專用函數(註:新版本建議改用 VARCHAR(MAX)、VARBINARY(MAX))。
CONVERT(target_type [ ( length ) ], expression [, style ])
| Style | 格式範例 | 說明 |
|---|---|---|
| 101 | 01/15/2024 | 美式 mm/dd/yyyy |
| 102 | 2024.01.15 | ansi yy.mm.dd |
| 103 | 15/01/2024 | 英式 dd/mm/yyyy |
| 112 | 20240115 | ISO yyyymmdd(無分隔符,適合排序) |
| 120 | 2024-01-15 14:30:00 | ODBC 標準 yyyy-mm-dd hh:mi:ss(24h) |
| 121 | 2024-01-15 14:30:00.000 | 含毫秒的 ODBC 格式 |
| 126 | 2024-01-15T14:30:00 | ISO8601 標準 |
-- 轉換失敗返回 NULL 而非報錯
SELECT TRY_CAST('abc' AS INT) -- NULL
SELECT TRY_CONVERT(DATE, '2024-13-01') -- NULL
-- 配合 CASE 處理異常資料
SELECT
raw_value,
CASE
WHEN TRY_CAST(raw_value AS INT) IS NULL THEN 'Invalid'
ELSE 'Valid'
END AS validation
FROM staging_table
-- 避免:WHERE varchar_col = 123 (導致索引失效) -- 建議:WHERE varchar_col = '123' 或 WHERE CAST(varchar_col AS INT) = 123
注意: TEXT、NTEXT、IMAGE 在未來版本將被移除,新開發請使用 VARCHAR(MAX)、NVARCHAR(MAX)、VARBINARY(MAX)。
| 函數 | 語法 | 功能 |
|---|---|---|
| TEXTPTR | TEXTPTR(column_name) | 返回指向 TEXT/IMAGE 欄位首頁資料的 16 位元組二進位指標 (varbinary),未初始化則返回 NULL |
| TEXTVALID | TEXTVALID('table.column', text_ptr) | 驗證指標有效性,有效返回 1,否則 0 |
-- 取得指標
DECLARE @ptr VARBINARY(16)
SELECT @ptr = TEXTPTR(doc_content) FROM documents WHERE doc_id = 1
-- 驗證指標
IF TEXTVALID('documents.doc_content', @ptr) = 1
BEGIN
-- 讀取前 100 位元組
READTEXT documents.doc_content @ptr 0 100
-- 附加寫入
UPDATETEXT documents.doc_content @ptr NULL 0 'New content'
END
-- 新版本直接當作一般字串處理 UPDATE documents SET doc_content = doc_content + ' appended text' WHERE doc_id = 1 -- 部分更新 UPDATE documents SET doc_content = STUFF(doc_content, 1, 10, 'New header') WHERE doc_id = 1