close

過去都是透過資料庫備分,將客戶端資料庫主機的資料打包回開發端使用。但是從去年開始,客戶新採購的機器都已經是 SQL server 2008,但我手邊部分機器上頭執行的還是 SQL server 2005,若將 SQL server 2008 備分的檔案直接還原到 SQL server 2005,會發生新版中匯出的資料無法匯入至舊版的錯誤。

參考保哥的《如何利用「資料庫發行精靈」將新版 SQL 資料庫降級成舊版》,發現可以利用 SQL server 內建的工具「資料庫發行精靈」,將資料轉換成 SQL 語法(包括產生資料表、將既有資料串接為 INSERT INTO 語句以供還原匯入)。

 

 

以我手邊的 SQL server 2005 Express 版來說,要獨立開啟這個「資料庫發行精靈」,可以直接執行下列路徑的檔案:
  C:\Program Files\Microsoft SQL Server\90\Tools\Publishing\1.2\SqlPubWiz.exe

我有一個資料庫,內容總量大約是 15 萬筆,資料庫發行精靈產生出的 SQL 腳本大約有 176 MB。不知道是不是因為我現在使用的是配備太陽春的筆記型電腦?我在 SSMS (Microsoft SQL Server Management Studio) 想要一口氣執行這個腳本,竟然宣告記憶體不足;若是一段一段執行,執行的行數一超過五千筆也會當機。

平常滿依賴 SSMS 的,遇到這種情況也只能研究看看怎麼執行腳本。MSDN 有《使用 sqlcmd 公用程式》。我沒有特別比較實際上的記憶體使用量,不過就作業系統本身運行的感覺,直接執行腳本自然是流暢很多,可能是視窗程式要繪製 SSMS 裡的結果太花時間吧。

我在命令提示字元執行的語法如下:
  sqlcmd -S PcName\SQLEXPRESS -U sa -P password -d DataBaseName -i C:\Script.sql -o C:\log.txt

-S: 此處為在 SSMS 裡寫在「伺服器名稱」的值
-U: 此處為在 SSMS 裡寫在「登入」的值
-P: 此處為在 SSMS 裡寫在「密碼」的值
-i: 匯入的腳本檔,也就是剛才使用資料庫發行精靈 (SqlPubWiz.exe) 產生出來的檔案
-o: 匯出的檔案,內容大致是平常在 SSMS 裡執行 SQL 語法時會出現在「訊息」窗格裡的內容(我是覺得這批匯入所產生的 log,和我在 SSMS 執行時看到的訊息量不太一樣)


以我的硬體設備與資料量,大約 25 分鐘執行完畢。期間我還是可以正常做我自己的事。(如果用 SSMS 就整個系統都卡住了,泣)

(2022/12/12 update!) 現在的個人電腦上不像之前有安裝 SQL Server Express 資料庫本身,只有裝 SQL Server Management Studio (SSMS) 管理工具。

在 SQL Server Management Studio v18.12.1 裡點選選單「查詢 > SQLCMD 模式」,沒有反應。

在 cmd 裡直接執行 sqlcmd 時,會出現錯誤訊息:

'sqlcmd' 不是內部或外部命令、可執行的程式或批次檔。

查了一下找到 MSDN 的《sqlcmd 公用程式》說明文件,似乎 SQL Server 2014 與其更舊版本才有內建 sqlcmd,在較新的近期版本則需要由該份說明文件中的載點下載安裝。

安裝後的執行指令,一樣是老樣子:

  sqlcmd -S {hostname} -U {id} -P {password} -d {DataBaseName} -i C:\Script.sql -o C:\log.txt

如果出現錯誤訊息顯示未安裝 Driver,要到《下載 ODBC Driver for SQL Server》下載對應的版本,錯誤訊息範例如下:

Sqlcmd: 錯誤: Microsoft ODBC Driver 17 for SQL Server : 找不到資料來源名稱且未指定預設的驅動程式。

-

(2019/02/21 update!) 今天又有一個需要是在 MySQL 裡執行 SQL script 了,這次的做法是這樣:

  • STEP 1: 我從我自己的電腦連到測試資料庫,我的開發電腦只有 MySQL Workbench,所以先切到 Workbench 的目錄下,才有 mysql.exe 能使用。
    cd C:\Program Files\MySQL\MySQL Workbench 6.3 CE
  • STEP 2: 執行準備好的 SQL 腳本。指令格式如下:
    mysql -u {資料庫使用者帳號} --h {資料庫主機 IP} -D {資料庫名稱} < {SQL script路徑}
    例如:
    mysql -u root --h 127.0.0.1 -D mydatabase < d:\news_release.sql
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 小攻城師 的頭像
    小攻城師

    小攻城師的戰場筆記

    小攻城師 發表在 痞客邦 留言(0) 人氣()