﻿# 將資料庫表格中的資料以 INSERT INTO 指令的方式匯出

通常我們從 SQL Server 匯出資料到另一台主機大致上有幾種方式：

1.  使用 bcp.exe 匯出成純文字格式，在到另一台主機用 bcp.exe 匯入資料
2.  使用 DTS (Data Transformation Services) 或 SSIS (SQL Server Integration Services) 將資料封裝成檔案，並帶到另一台 Server 匯入資料。
3.  備份整個資料庫，將備份檔(\*.bak)帶到另一台主機還原資料
4.  卸載(Detach)資料庫，將資料庫檔(\*.mdf 與 \*.ldf)帶到另一台主機附加(Attach)資料庫

我以前常用 MySQL 資料庫，匯出資料庫的時候都是 DDL ( CREATE TABLE, ... ), DML (INSERT INTO, ... ) 的格式儲存，要移轉資料到其他主機都很方便。但改用 SQL Server 時這些東西都不見了，讓我困擾了好久，有時後為了轉移一些資料都要花費很大的力氣將資料轉移到遠端的主機，因為有些遠端的 SQL Server 是無法直接用 Management Studio 遠端連接，只能用 Web 介面管理時，就很很麻煩。

但我今天在[這裡](https://github.com/lambacck/generate_inserts)發現一個神奇的預儲程序(Stored Procedure)，作者是一位叫做 Narayana Vyas Kondreddi 的仁兄，光看名字實在看不出是哪一國人 :-p

他寫的 T-SQL 可以將表格中的資料全部都轉成 INSERT INTO 的形式，方便你將資料帶到另一台主機，只要執行 INSERT INTO 指令就可以將資料新增到另一台主機了。

這個預儲程序的優點有：

-   Data from both tables and views can be scripted
-   No CURSORs are used
-   Table names and column names with spaces are handled
-   All datatypes are handled except images, large text and binary columns with more than 4 bytes
-   NULLs are gracefully handled
-   Timestamp columns are handled
-   Identity columns are handled
-   Very flexible and configurable
-   Non-dbo owned tables are handled
-   Computed columns are handled
-   You can filter the rows for which you want to generate INSERTs

下載 Stored Procedure：

-   [下載 SQL Server 2000 的版本](https://github.com/lambacck/generate_inserts/blob/master/generate_inserts.sql)
-   [下載 SQL Server 2005 的版本](https://gist.github.com/mlprosper/4969061)

在[原作者的網站](https://github.com/lambacck/generate_inserts)有 14 個使用說明範例(Usage Example)，各位可以上去看看。執行完下載的 T-SQL Script 之後會在 master 資料庫中新增一個 dbo.sp\_generate\_inserts 預儲程序物件，如下圖示：

![執行完下載的 T-SQL Script 之後會在 master 資料庫中新增一個 dbo.sp\_generate\_inserts 預儲程序物件](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/73fb8ac1c4690eab49bd-image_3.png)

不過缺點是這個方法沒辦法適用於有文字欄位內容超過 8KB 的資料，因為輸出的結果是顯示在 SSMS ( SQL Server Management Studio ) 中，輸出的欄位長度是有限制的。

另外，這個預儲程序我有發現一個小問題，就是當執行完畢後，匯出的資料中如果內容中有「斷行符號」的話，全部都會被置換成「空白」字元，導致匯入的時候所有斷行字元都會被換成空白符號，資料就被破壞掉了。

我個人花了 2 個小時將這個 Script 研究過一遍並將問題給修正了（只改了兩行），用 T-SQL 產生 T-SQL 的程式碼真的會讓人眼花撩亂，一大堆單引號 Quote 來 Quote 去的，你自己看程式碼就知道了，我將更新過的 T-SQL Script 放在以下檔案中，我只有改寫 SQL 2005 的版本而已：

-   [下載 SQL Server 2005 的版（Will 修正斷行字元被吃掉的問題）](https://stwillblogassets.blob.core.windows.net/files/sp_generate_inserts_SQL2005_Will_Fixed.sql)

**參考連結**

-   [Procedure to script your data (to generate INSERT statements from the existing data)](https://github.com/lambacck/generate_inserts)
-   [dumping data from database](http://bytes.com/forum/thread82029.html)
