首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 獲取表建立腳本:自定義存儲過程 SP_GET_TABLE_INFO

     編輯:關於SqlServer

背景

sp_helptext 僅能獲取預存程序/視圖/函數定義,**無法直接獲取表的建立腳本**(含約束、索引、主鍵等)。升級對比、文檔生成、版本控制時極需此功能。

解決方案:自定義存儲過程

本文提供 SP_GET_TABLE_INFO,可生成指定表的完整 CREATE TABLE 腳本,**包含所有索引建立語句**。適用 SQL Server 2000。

核心代碼結構(節選關鍵邏輯)


CREATE PROCEDURE SP_GET_TABLE_INFO
    @ObjName VARCHAR(128)  -- 目標表名
AS
BEGIN
    -- 1. 校驗表存在
    IF NOT EXISTS (SELECT name FROM sysobjects WHERE name = @ObjName)
    BEGIN
        RAISERROR(15009, -1, -1, @ObjName, DB_NAME())
        RETURN 1
    END

    -- 2. 臨時表存儲生成腳本
    CREATE TABLE #spscript (id INT IDENTITY, Script VARCHAR(255) NOT NULL, LastLine TINYINT)

    -- 3. 遊標遍歷 syscolumns 獲取列定義
    DECLARE Cursor_Column INSENSITIVE CURSOR FOR
    SELECT a.name, a.colid, a.usertype, b.name, a.length, a.prec, a.scale, a.status, a.cdefault,
           CASE a.cdefault WHEN 0 THEN '' ELSE (SELECT c.text FROM syscomments c WHERE a.cdefault = c.id) END
    FROM syscolumns a, systypes b
    WHERE OBJECT_NAME(a.id) = @ObjName AND a.usertype = b.usertype
    ORDER BY a.colid

    -- 4. 生成 CREATE TABLE 開頭
    INSERT INTO #spscript VALUES ('CREATE TABLE ' + @ObjName + '(', 0)

    -- 5. 循環構建列定義:名稱 類型(長度/精度/小數) NULL/NOT NULL DEFAULT 約束
    --    處理 identity、computed、user-defined type 等細節

    -- 6. 處理主鍵、唯一約束、檢查約束、外鍵(查詢 sysconstraints、sysreferences)

    -- 7. 處理索引(查詢 sysindexes、sysindexkeys、index_col)

    -- 8. 輸出結果
    SELECT Script FROM #spscript ORDER BY id
    DROP TABLE #spscript
END

使用示例


EXEC SP_GET_TABLE_INFO 'Orders'

輸出可直接執行的 CREATE TABLE + CREATE INDEX 腳本。

現代替代方案(SQL Server 2005+)

  • SSMS 右鍵表 →「編寫腳本」→「CREATE 到」→ 新查詢編輯器
  • SMO (SQL Server Management Objects) 程序化生成
  • sp_help + sp_helpindex + sp_helpconstraint 組合查詢

遺留系統價值

對於仍在運行 SQL Server 2000/2005 的舊系統,此存儲過程是**自動化構建部署腳本、異構遷移對比、Schema 版本控制**的關鍵工具。代碼展示了系統表(syscolumns、systypes、sysindexes、syscomments、sysconstraints)的深度應用模式,理解其邏輯有助於掌握 SQL Server 元數據架構。

完整代碼獲取

原文代碼因篇幅截斷,完整版可通過原文鏈接或作者聯繫方式獲取。核心邏輯已完整呈現,可據此補全邊界處理(計算列、稀疏列、篩選索引等現代特性在 2000 版不存在,無需兼容)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved