程式碼 (Classic ASP / VBScript)
<%
Dim i, Rs, Sql, Table, Column, Bool
Table = "A"
Column = "B"
Bool = False
Sql = "SELECT * FROM [" & Table & "]"
Set Rs = Conn.Execute(Sql) ' 需先建立 Conn 連線物件
For Each i In Rs.Fields
If i.Name = Column Then
Bool = True
Exit For
End If
Next
If Bool Then
Response.Write("在《" & Table & "》表中,存在《" & Column & "》欄位!")
Else
Response.Write("在《" & Table & "》表中,不存在《" & Column & "》欄位!")
End If
%>
原理解析
- 開啟
SELECT * FROM Table (不實際取資料,僅取得 Recordset.Fields 集合)。
- 遍歷
Fields 比對欄位名稱。
- 若不存在,後續可動態執行
ALTER TABLE A ADD B datatype (需依資料庫語法調整)。
改進建議 (效能與安全)
- 避免 SELECT *:改用
SELECT TOP 0 * FROM ... 或直接查詢系統目錄 (INFORMATION_SCHEMA.COLUMNS / sys.columns) 更輕量。
- 參數化:表名/欄位名無法參數化,嚴格驗證輸入防注入。
- 權限:連線帳號需具備
ALTER TABLE 權限。
現代替代方案 (T-SQL 純資料庫端)
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID('A') AND name = 'B')
BEGIN
ALTER TABLE A ADD B VARCHAR(100) NULL; -- 依需求調整型別
END
將判斷邏輯下推至資料庫層,避免應用層往返,並可封裝為預存程序統一管理。