SQL SERVER 比較兩個數據庫中表和字段的差異


在開發過程中線上的數據庫表字段和本地數據庫表字段是存在的,也許我們在本地數據庫中所增加的表字段都會有記錄到SQL文件中,但當增加的表及字段名稱較多時總會出現漏網之魚,發布真是版本的時候回出現很多很多的問題,那么如何在發布新的版本時保證線上數據庫與本地數據庫中的表字段都是統一的了,下面我說一個比較笨的方法去保證兩個數據庫無差異。

    1、將線上的數據庫架構生成成為SQL,操作如下: 選擇中某線上數據庫 → 任務 → 生成腳本 → 下一步  → 選擇對象窗口,選擇(編寫整個數據庫及所有數據庫對象的腳本)下一步  → 設置腳本編寫選項窗口,輸出類型選項卡中選擇 “將腳本保存到特定的位置”  點擊“高級”按鈕,彈出 高級腳本編寫選項,將出現“表/試圖選項”及“常規”,在“常規選項中”找到“ 要編寫腳本的數據的類型 ”項 選擇 “僅限架構” 點擊“確定”按鈕,在文件名選項中選擇文件保存的路徑  →  下一步  →  下一步 → 完成 。

    2、在本地新建一個數據庫(數據庫名稱不能和將要對比的數據庫名稱一樣),然后在新創建的數據庫中執行第一個步保存的文件。

    3、開始對比兩個數據庫,執行如下SQL語句,如下SQL語句中INTFSIMSNEW 表示新數據庫(線上數據庫,也就是剛剛第二步新建的數據庫),INTFSIMS 表示舊數據庫(本地數據庫),將如下SQL語句中所有 INTFSIMSNEW 替換成你新建的數據庫名稱,INTFSIMS 替換成你本地的數據庫名稱
-- u表,p存儲過程,v視圖
-- INTFSIMSNEW新庫,INTFSIMS舊庫

SELECT NTABLE = A.NAME, OTABLE = B.NAME
FROM INTFSIMSNEW..SYSOBJECTS A
  LEFT JOIN INTFSIMS..SYSOBJECTS B
    ON A.NAME = B.NAME
WHERE ISNULL(B.NAME, '') = ''
  AND A.XTYPE = 'U'

UNION ALL

SELECT NTABLE = B.NAME, OTABLE = A.NAME
FROM INTFSIMS..SYSOBJECTS A
  LEFT JOIN INTFSIMSNEW..SYSOBJECTS B
    ON A.NAME = B.NAME
WHERE ISNULL(B.NAME, '') = ''
  AND A.XTYPE = 'U'
ORDER BY 1, 2

-- 比較兩個數據庫中每個表字段的差異
SELECT
  表名A = CASE WHEN ISNULL(A.TABLENAME, '') <> '' THEN A.TABLENAME ELSE B.TABLENAME END,
  字段名A = A.FIELDNAME,
  字段名B = B.FIELDNAME,
  順序= A.FIELDSNO,
  說明= CASE WHEN A.FIELDTYPE <> B.FIELDTYPE THEN '類型: ' + A.FIELDTYPE + '-->' + B.FIELDTYPE
              WHEN A.FIELDSNO <> B.FIELDSNO THEN '順序: ' + str(A.FIELDSNO) + '-->' + str(B.FIELDSNO)
              WHEN A.LENGTH <> B.LENGTH THEN '長度: ' + str(A.LENGTH) + '-->' + str(B.LENGTH)
              WHEN A.LENSEC <> B.LENSEC THEN '小數位: ' + str(A.LENSEC) + '-->' + str(B.LENSEC)
              WHEN A.ALLOWNULL <> B.ALLOWNULL THEN '允許空值: ' + str(A.ALLOWNULL) + '-->' + str(B.ALLOWNULL)
         END
FROM (SELECT
        TABLENAME = B.NAME,
        FIELDNAME = A.NAME,
        FIELDSNO = A.COLID,
        FIELDTYPE = C.NAME,
        LENGTH = A.LENGTH,
        LENSEC = A.XSCALE,
        ALLOWNULL = A.ISNULLABLE
      FROM INTFSIMSNEW..SYSCOLUMNS A
        LEFT JOIN INTFSIMSNEW..SYSOBJECTS B
          ON A.ID = B.ID
        LEFT JOIN INTFSIMSNEW..SYSTYPES C
          ON A.XUSERTYPE = C.XUSERTYPE
      WHERE B.XTYPE = 'U') A
  FULL JOIN (SELECT
               TABLENAME = B.NAME,
               FIELDNAME = A.NAME,
               FIELDSNO = A.COLID,
               FIELDTYPE = C.NAME,
               LENGTH = A.LENGTH,
               LENSEC = A.XSCALE,
               ALLOWNULL = A.ISNULLABLE
             FROM INTFSIMS..SYSCOLUMNS A
               LEFT JOIN INTFSIMS..SYSOBJECTS B
                 ON A.ID = B.ID
               LEFT JOIN INTFSIMS..SYSTYPES C
                 ON A.XUSERTYPE = C.XUSERTYPE
             WHERE B.XTYPE = 'U') B
    ON A.TABLENAME = B.TABLENAME
      AND A.FIELDNAME = B.FIELDNAME
WHERE ISNULL(A.TABLENAME, '') = ''
  OR ISNULL(B.TABLENAME, '') = ''
  OR A.FIELDTYPE <> B.FIELDTYPE
  OR A.FIELDSNO <> B.FIELDSNO
  OR A.LENGTH <> B.LENGTH
  OR A.LENSEC <> B.LENSEC
  OR A.ALLOWNULL <> B.ALLOWNULL
ORDER by 1, 4

  

 
        
在開發過程中線上的數據庫表字段和本地數據庫表字段是存在的,也許我們在本地數據庫中所增加的表字段都會有記錄到SQL文件中,但當增加的表及字段名稱較多時總會出現漏網之魚,發布真是版本的時候回出現很多很多的問題,那么如何在發布新的版本時保證線上數據庫與本地數據庫中的表字段都是統一的了,下面我說一個比較笨的方法去保證兩個數據庫無差異。

    1、將線上的數據庫架構生成成為SQL,操作如下: 選擇中某線上數據庫 → 任務 → 生成腳本 → 下一步  → 選擇對象窗口,選擇(編寫整個數據庫及所有數據庫對象的腳本)下一步  → 設置腳本編寫選項窗口,輸出類型選項卡中選擇 “將腳本保存到特定的位置”  點擊“高級”按鈕,彈出 高級腳本編寫選項,將出現“表/試圖選項”及“常規”,在“常規選項中”找到“ 要編寫腳本的數據的類型 ”項 選擇 “僅限架構” 點擊“確定”按鈕,在文件名選項中選擇文件保存的路徑  →  下一步  →  下一步 → 完成 。

    2、在本地新建一個數據庫(數據庫名稱不能和將要對比的數據庫名稱一樣),然后在新創建的數據庫中執行第一個步保存的文件。

    3、開始對比兩個數據庫,執行如下SQL語句,如下SQL語句中INTFSIMSNEW 表示新數據庫(線上數據庫,也就是剛剛第二步新建的數據庫),INTFSIMS 表示舊數據庫(本地數據庫),將如下SQL語句中所有 INTFSIMSNEW 替換成你新建的數據庫名稱,INTFSIMS 替換成你本地的數據庫名稱
-- u表,p存儲過程,v視圖
-- INTFSIMSNEW新庫,INTFSIMS舊庫

SELECT NTABLE = A.NAME, OTABLE = B.NAME FROM INTFSIMSNEW..SYSOBJECTS A LEFT JOIN INTFSIMS..SYSOBJECTS B ON A.NAME = B.NAME WHERE ISNULL(B.NAME, '') = '' AND A.XTYPE = 'U' UNION ALL SELECT NTABLE = B.NAME, OTABLE = A.NAME FROM INTFSIMS..SYSOBJECTS A LEFT JOIN INTFSIMSNEW..SYSOBJECTS B ON A.NAME = B.NAME WHERE ISNULL(B.NAME, '') = '' AND A.XTYPE = 'U' ORDER BY 1, 2 -- 比較兩個數據庫中每個表字段的差異 SELECT 表名A = CASE WHEN ISNULL(A.TABLENAME, '') <> '' THEN A.TABLENAME ELSE B.TABLENAME END, 字段名A = A.FIELDNAME, 字段名B = B.FIELDNAME, 順序= A.FIELDSNO, 說明= CASE WHEN A.FIELDTYPE <> B.FIELDTYPE THEN '類型: ' + A.FIELDTYPE + '-->' + B.FIELDTYPE WHEN A.FIELDSNO <> B.FIELDSNO THEN '順序: ' + str(A.FIELDSNO) + '-->' + str(B.FIELDSNO) WHEN A.LENGTH <> B.LENGTH THEN '長度: ' + str(A.LENGTH) + '-->' + str(B.LENGTH) WHEN A.LENSEC <> B.LENSEC THEN '小數位: ' + str(A.LENSEC) + '-->' + str(B.LENSEC) WHEN A.ALLOWNULL <> B.ALLOWNULL THEN '允許空值: ' + str(A.ALLOWNULL) + '-->' + str(B.ALLOWNULL) END FROM (SELECT TABLENAME = B.NAME, FIELDNAME = A.NAME, FIELDSNO = A.COLID, FIELDTYPE = C.NAME, LENGTH = A.LENGTH, LENSEC = A.XSCALE, ALLOWNULL = A.ISNULLABLE FROM INTFSIMSNEW..SYSCOLUMNS A LEFT JOIN INTFSIMSNEW..SYSOBJECTS B ON A.ID = B.ID LEFT JOIN INTFSIMSNEW..SYSTYPES C ON A.XUSERTYPE = C.XUSERTYPE WHERE B.XTYPE = 'U') A FULL JOIN (SELECT TABLENAME = B.NAME, FIELDNAME = A.NAME, FIELDSNO = A.COLID, FIELDTYPE = C.NAME, LENGTH = A.LENGTH, LENSEC = A.XSCALE, ALLOWNULL = A.ISNULLABLE FROM INTFSIMS..SYSCOLUMNS A LEFT JOIN INTFSIMS..SYSOBJECTS B ON A.ID = B.ID LEFT JOIN INTFSIMS..SYSTYPES C ON A.XUSERTYPE = C.XUSERTYPE WHERE B.XTYPE = 'U') B ON A.TABLENAME = B.TABLENAME AND A.FIELDNAME = B.FIELDNAME WHERE ISNULL(A.TABLENAME, '') = '' OR ISNULL(B.TABLENAME, '') = '' OR A.FIELDTYPE <> B.FIELDTYPE OR A.FIELDSNO <> B.FIELDSNO OR A.LENGTH <> B.LENGTH OR A.LENSEC <> B.LENSEC OR A.ALLOWNULL <> B.ALLOWNULL ORDER by 1, 4


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM