在 SQL Server 中尋找忘記的欄位位置

前言

操作資料庫的時候,你是否曾經遇到以下情況:

  • 需要查詢某個欄位,但完全忘記它在哪張資料表
  • 資料庫中有上百張表,一個一個找太花時間
  • 急著要處理問題,但找不到正確的資料表位置

今天要和大家分享幾個在 SQL Server 中快速找到特定欄位位置的實用技巧。

基本搜尋方法

最簡單的方法是使用系統視圖(System Views)來查詢。以下是基礎查詢語法:

1
2
3
4
5
6
7
8
9
10
11
SELECT 
t.name AS TableName,
c.name AS ColumnName
FROM
sys.tables t
INNER JOIN
sys.columns c ON t.object_id = c.object_id
WHERE
c.name LIKE '%YourColumnName%'
ORDER BY
TableName, ColumnName;

使用說明

  1. YourColumnName 替換成你要搜尋的欄位名稱
  2. % 符號代表萬用字元,可以做模糊搜尋
  3. 查詢結果會顯示所有符合的資料表名稱及欄位名稱

進階搜尋技巧

如果要搜尋更詳細的資訊,可以使用以下進階查詢:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT 
SCHEMA_NAME(t.schema_id) AS SchemaName,
t.name AS TableName,
c.name AS ColumnName,
typ.name AS DataType,
c.max_length AS MaxLength,
c.precision AS Precision,
c.scale AS Scale,
c.is_nullable AS IsNullable
FROM
sys.tables t
INNER JOIN
sys.columns c ON t.object_id = c.object_id
INNER JOIN
sys.types typ ON c.user_type_id = typ.user_type_id
WHERE
c.name LIKE '%YourColumnName%'
ORDER BY
SchemaName, TableName, ColumnName;

這個查詢會額外顯示:

  • 綱要名稱 (Schema Name)
  • 資料型別 (Data Type)
  • 欄位長度 (Max Length)
  • 精確度 (Precision)
  • 小數位數 (Scale)
  • 是否允許空值 (Is Nullable)

跨資料庫搜尋

如果需要在所有資料庫中搜尋特定欄位,可以使用以下查詢:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
CREATE TABLE #Results (
DatabaseName NVARCHAR(128),
SchemaName NVARCHAR(128),
TableName NVARCHAR(128),
ColumnName NVARCHAR(128)
)

DECLARE @SQL NVARCHAR(MAX)
DECLARE @DatabaseName NVARCHAR(128)

DECLARE db_cursor CURSOR FOR
SELECT name
FROM sys.databases
WHERE database_id > 4 -- 排除系統資料庫
AND state_desc = 'ONLINE'

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @DatabaseName

WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = '
USE [' + @DatabaseName + ']
INSERT INTO #Results
SELECT
''' + @DatabaseName + ''' AS DatabaseName,
SCHEMA_NAME(t.schema_id) AS SchemaName,
t.name AS TableName,
c.name AS ColumnName
FROM
sys.tables t
INNER JOIN
sys.columns c ON t.object_id = c.object_id
WHERE
c.name LIKE ''%YourColumnName%'''

EXEC sp_executesql @SQL

FETCH NEXT FROM db_cursor INTO @DatabaseName
END

CLOSE db_cursor
DEALLOCATE db_cursor

SELECT * FROM #Results
ORDER BY DatabaseName, SchemaName, TableName, ColumnName

DROP TABLE #Results

注意事項

  1. 這個查詢會搜尋所有非系統資料庫
  2. 需要適當的資料庫權限
  3. 執行時間可能較長,視資料庫數量而定

實用小技巧

  1. 精確搜尋:如果知道完整欄位名稱,移除 LIKE 中的 % 符號

    1
    WHERE c.name = 'ExactColumnName'
  2. 區分大小寫:加入 COLLATE Latin1_General_CS_AS

    1
    WHERE c.name LIKE '%ColumnName%' COLLATE Latin1_General_CS_AS
  3. **搜尋檢視表(View)**:修改 sys.tablessys.views

    1
    FROM sys.views t

結語

善用這些查詢技巧,可以大幅提升在 SQL Server 中尋找欄位的效率。建議將這些查詢儲存為範本,需要時可以快速使用。

參考資料

  • SQL Server 官方文件
  • MSDN System Views 文件