2009-06-11 146 views
452

我們正在編寫一個新的應用程序,在測試時,我們需要一堆虛擬數據。我已經使用MS Access將這些數據添加到相關表格中。什麼是爲SQL Server表自動生成INSERT語句的最佳方法?

每隔一段時間,我們都希望「刷新」相關表格,這意味着全部刪除它們,重新創建它們,並運行已保存的MS Access追加查詢。

第一部分(刪除&重新創建)是一個簡單的SQL腳本,但最後一部分讓我畏縮。我想要一個包含一堆INSERT的安裝腳本來重新生成虛擬數據。

我現在有表中的數據。從該數據集自動生成大量INSERT語句的最佳方法是什麼?

我想到的東西就像TOAD(對於Oracle),你可以右鍵單擊一個網格,然後單擊另存爲 - >插入語句,它只會在你想要的地方轉儲一個大的SQL腳本。

我能想到這樣做的唯一事情是這樣的表保存到一個Excel工作表,然後寫Excel公式創建的每一行,這肯定不是最好的辦法一個INSERT。

我正在使用2008 Management Studio連接到SQL Server 2005數據庫。

+1

哇,我剛剛檢查了我的安裝,你說得對,「腳本表作爲」 - >「插入」只給你一個插入模板,而不是插入的一個頁面,你實際數據!我希望你的問題得到解答,因爲我想要一個簡單的方法去做你也在問的事情。 – JoeCool 2009-06-11 17:46:52

回答

810

腳本表時,微軟應該宣傳的2008年SSMS你正在尋找的是內置在生成腳本實用的功能,這樣的功能,但功能是默認關閉的,並且必須啓用。

這是一個快速運行通過生成所有表格中的數據的INSERT語句,使用任何腳本或加載項到SQL Management Studio中2008:

  1. 在數據庫上單擊鼠標右鍵,去任務>生成腳本
  2. 選擇要生成腳本的表(或對象)。
  3. 轉至設置腳本選項選項卡並單擊高級按鈕。
  4. 一般類別,然後轉至類型數據的腳本
  5. 有3種選擇:僅架構數據只有,並模式和數據。選擇適當的選項並點擊確定

然後,您將得到CREATE TABLE語句和所有INSERT語句直接從SSMS中獲取數據。

0

爲什麼不只是備份與它的工作之前的數據,然後還原,當你希望它被刷新?

,如果你必須生成插入嘗試:http://vyaskn.tripod.com/code.htm#inserts

+0

我想要靈活地編輯INSERT中的數據,如果我想。除此之外,沒有真正的理由......我需要研究RESTORE和BACKUP的語法,所以我可以通過腳本來完成。 – JosephStyons 2009-06-11 17:46:22

71

我們使用這個存儲過程 - 它允許你針對特定表,並且使用WHERE子句。你可以找到文字here

例如,它可以讓你做到這一點: 要生成表「標題」 INSERT語句:

EXEC sp_generate_inserts 'titles' 
+1

這對我來說非常合適,只不過生成的INSERT在末尾沒有分號。我補充說,併成功地使用它。感謝您回答qstn! – JosephStyons 2009-06-11 19:57:36

+0

我很高興它爲你效力! – 2009-06-11 20:21:02

+0

哇...方便的小腳本....精彩 – CMB 2009-07-17 19:44:28

0

不知道,如果我理解你的問題正確。

如果MS-Access中有數據要移動到SQL Server中,則可以使用DTS。
而且,我想你可以使用SQL分析器查看所有的INSERT語句。

1

您是否有生產數據庫中的數據?如果是這樣,您可以通過DTS設置數據的週期刷新。我們每週都會在週末做我們的工作,我們每週都會爲我們的測試提供乾淨,真實的數據,這是非常好的。

如果您還沒有生產,那麼您應該創建一個他們想要的數據庫(新鮮)。然後,複製該數據庫並將該新創建的數據庫用作您的測試環境。當你想要乾淨的版本,只需複製你的乾淨的一個,並Bob's your uncle

7

第一個鏈接到sp_generate_inserts是很酷,這裏是一個非常簡單的版本:

DECLARE @Fields VARCHAR(max); SET @Fields = '[QueueName], [iSort]' -- your fields, keep [] 
DECLARE @Table VARCHAR(max); SET @Table = 'Queues'    -- your table 

DECLARE @SQL VARCHAR(max) 
SET @SQL = 'DECLARE @S VARCHAR(MAX) 
SELECT @S = ISNULL(@S + '' UNION '', ''INSERT INTO ' + @Table + '(' + @Fields + ')'') + CHAR(13) + CHAR(10) + 
''SELECT '' + ' + REPLACE(REPLACE(REPLACE(@Fields, ',', ' + '', '' + '), '[', ''''''''' + CAST('),']',' AS VARCHAR(max)) + ''''''''') +' FROM ' + @Table + ' 
PRINT @S' 

EXEC (@SQL) 

在我的系統,我得到這樣的結果:

INSERT INTO Queues([QueueName], [iSort]) 
SELECT 'WD: Auto Capture', '10' UNION 
SELECT 'Car/Lar', '11' UNION 
SELECT 'Scan Line', '21' UNION 
SELECT 'OCR', '22' UNION 
SELECT 'Dynamic Template', '23' UNION 
SELECT 'Fix MICR', '41' UNION 
SELECT 'Fix MICR (Supervisor)', '42' UNION 
SELECT 'Foreign MICR', '43' UNION 
... 
0

我也研究了這個地段,但我不能得到這個具體的解決方案。目前我所遵循的方法是從SQL Server Managment studio複製excel中的內容,然後將數據導入Oracle-TOAD,然後生成插入語句

2

我使用sqlite來做到這一點。我發現它對創建scratch/test數據庫非常有用。

sqlite3 foo.sqlite .dump > foo_as_a_bunch_of_inserts.sql

3

我用這個script,我把它放在我的博客上(如何在sql server上生成插入語句程序)。

到目前爲止我已經爲我工作,雖然他們可能是我還沒有發現的錯誤。

37

正如@Mike Ritacco提及,但更新2008年SSMS R2

  1. 上的數據庫名稱
  2. 選擇任務右鍵點擊>生成腳本
  3. 根據您的設置的介紹頁面可以顯示或不
  4. 選擇「選擇特定數據庫對象」,
  5. 展開樹視圖,並檢查相關表格
  6. 點擊下一步
  7. 單擊高級
  8. 在常規部分,選擇「數據類型腳本」
  9. 相應的選項完成嚮導

然後,您將得到所有的數據的INSERT語句直接出SSMS。

編輯2016-10-25 SQL Server 2016/SSMS 13.0.15900。1

  1. 右擊數據庫名稱

  2. 選擇任務>生成腳本

  3. 根據您的設置的介紹頁面可以顯示或不

  4. 選擇「選擇特定數據庫對象,

  5. 展開樹視圖和c赫克相關表格

  6. 單擊下一步

  7. 單擊高級

  8. 在常規部分,選擇

  9. 單擊OK '數據 腳本的類型' 中選擇相應的選項

  10. 選擇是否要輸出去一個新的查詢,剪貼板或 文件

  11. 單擊下一步兩次

  12. 你的劇本是根據你上面

  13. 挑設置準備單擊完成

23

我使用SSMS 2008版10.0.5500.0。在這個版本中,作爲生成腳本嚮導的一部分,而不是高級按鈕,下面是一個屏幕。在這種情況下,我只想插入數據並且沒有創建語句,所以我必須更改兩個圈出來的屬性Script Options

4

我對這個問題的貢獻是Powershell INSERT腳本生成器,它允許您腳本多個表而不必使用麻煩的SSMS GUI。非常適合將「種子」數據快速持久保存到源代碼控制中。

  1. 將下面的腳本保存爲「filename.ps1」。
  2. 對「CUSTOMIZE ME」下的區域進行自己的修改。
  3. 您可以將表格列表以任意順序添加到腳本中。
  4. 你可以打開PowerShell ISE中的腳本,然後按下播放按鈕,或者乾脆在PowerShell命令提示符下執行腳本。

默認情況下,生成的INSERT腳本將與腳本位於同一文件夾下的「SeedData.sql」。

您將需要SQL Server管理對象安裝組件,它應該有,如果你有安裝SSMS。

Add-Type -AssemblyName ("Microsoft.SqlServer.Smo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91") 
Add-Type -AssemblyName ("Microsoft.SqlServer.ConnectionInfo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91") 



#CUSTOMIZE ME 
$outputFile = ".\SeedData.sql" 
$connectionString = "Data Source=.;Initial Catalog=mydb;Integrated Security=True;" 



$sqlConnection = new-object System.Data.SqlClient.SqlConnection($connectionString) 
$conn = new-object Microsoft.SqlServer.Management.Common.ServerConnection($sqlConnection) 
$srv = new-object Microsoft.SqlServer.Management.Smo.Server($conn) 
$db = $srv.Databases[$srv.ConnectionContext.DatabaseName] 
$scr = New-Object Microsoft.SqlServer.Management.Smo.Scripter $srv 
$scr.Options.FileName = $outputFile 
$scr.Options.AppendToFile = $false 
$scr.Options.ScriptSchema = $false 
$scr.Options.ScriptData = $true 
$scr.Options.NoCommandTerminator = $true 

$tables = New-Object Microsoft.SqlServer.Management.Smo.UrnCollection 



#CUSTOMIZE ME 
$tables.Add($db.Tables["Category"].Urn) 
$tables.Add($db.Tables["Product"].Urn) 
$tables.Add($db.Tables["Vendor"].Urn) 



[void]$scr.EnumScript($tables) 

$sqlConnection.Close() 
6

如果您需要編程訪問,那麼您可以使用開源存儲過程GenerateInsert。

INSERT statement(s) generator

只是作爲一個簡單的和簡單的例子,生成INSERT語句爲表AdventureWorks.Person.AddressType執行以下語句:

USE [AdventureWorks]; 
GO 
EXECUTE dbo.GenerateInsert @ObjectName = N'Person.AddressType'; 

,這將產生以下腳本:

SET NOCOUNT ON 
SET IDENTITY_INSERT Person.AddressType ON 
INSERT INTO Person.AddressType 
([AddressTypeID],[Name],[rowguid],[ModifiedDate]) 
VALUES 
(1,N'Billing','B84F78B1-4EFE-4A0E-8CB7-70E9F112F886',CONVERT(datetime,'2002-06-01 00:00:00.000',121)) 
,(2,N'Home','41BC2FF6-F0FC-475F-8EB9-CEC0805AA0F2',CONVERT(datetime,'2002-06-01 00:00:00.000',121)) 
,(3,N'Main Office','8EEEC28C-07A2-4FB9-AD0A-42D4A0BBC575',CONVERT(datetime,'2002-06-01 00:00:00.000',121)) 
,(4,N'Primary','24CB3088-4345-47C4-86C5-17B535133D1E',CONVERT(datetime,'2002-06-01 00:00:00.000',121)) 
,(5,N'Shipping','B29DA3F8-19A3-47DA-9DAA-15C84F4A83A5',CONVERT(datetime,'2002-06-01 00:00:00.000',121)) 
,(6,N'Archive','A67F238A-5BA2-444B-966C-0467ED9C427F',CONVERT(datetime,'2002-06-01 00:00:00.000',121)) 
SET IDENTITY_INSERT Person.AddressType OFF 
23

這也可以使用Visual Studio(至少在2013版以後)完成。

在VS 2013中,也有可能來篩選插入語句所基於的行列表,這是SSMS中不可能的,就我所知。

執行以下步驟:

  • 打開 「SQL Server的對象資源管理器」 窗口(菜單:/查看/ SQL Server的對象資源管理器)
  • 打開/擴展數據庫及其表
  • 權點擊表格並從上下文菜單中選擇「查看數據」
  • 這將顯示主區域中的數據
  • 可選步驟:點擊過濾器圖標「排序和過濾數據集」(第四個圖標從在結果上方的行左邊),並將一些過濾器應用於一列或多列
  • 單擊「腳本」或「腳本到文件」圖標(頂部行右側的圖標,它們看起來像小片)

這將爲所選表創建(條件)插入語句到活動窗口或文件。


「過濾器」 和 「腳本」 按鈕的Visual Studio 2013

enter image description here

3

GenerateData是這個驚人的工具。因爲源代碼可供您使用,因此也很容易對其進行調整。有幾個不錯的功能:爲人民名字

  • 名稱生成並放置
  • 能夠保存生成配置文件(這是下載併爲本地後)
  • 能力通過腳本來定製和操縱產生
  • 數據的許多不同輸出(CSV,Javascript,JSON等)(如果您需要在不同的環境中測試集並且想跳過數據庫訪問)
  • 免費。但考慮捐贈,如果你發現該軟件有用:)。

GUI

相關問題