web-dev-qa-db-ja.com

SQL ServerテーブルのINSERTステートメントを自動生成するための最良の方法は何ですか?

私たちは新しいアプリケーションを書いています、そしてテストしている間、ダミーデータの束が必要になります。 MS Accessを使用してExcelファイルを関連テーブルにダンプすることで、そのデータを追加しました。

多くの場合、関連するテーブルを "更新"します。つまり、それらすべてを削除し、それらを再作成して、保存されたMS Accessの追加クエリを実行します。

最初の部分(削除と再作成)は簡単なSQLスクリプトですが、最後の部分は私を悩ませます。ダミーデータを再生成するための多数のINSERTを含む単一のセットアップスクリプトが必要です。

私は今テーブルのデータを持っています。そのデータセットからINSERTステートメントの大きなリストを自動的に生成するための最善の方法は何ですか?

考えられる唯一の方法は、テーブルをExcelシートに保存してから、Excelの式を作成してすべての行にINSERTを作成することです。これは確実に最良の方法ではありません。

SQL Server 2005データベースに接続するために2008 Management Studioを使用しています。

532
JosephStyons

MicrosoftはSSMS 2008のこの機能を宣伝する必要があります。探している機能は Generate Script ユーティリティに組み込まれていますが、この機能はデフォルトでオフになっているため、テーブルのスクリプト作成時に有効にする必要があります。

これは、SQL Management Studio 2008へのスクリプトやアドインを使用せずに、テーブル内のすべてのデータについてINSERTステートメントを生成するための簡単な手順です。

  1. データベースを右クリックし、 タスク > スクリプトの生成 に移動します。
  2. スクリプトを生成したいテーブル(またはオブジェクト)を選択します。
  3. スクリプトオプションの設定 タブに移動し、 詳細設定 ボタンをクリックします。
  4. General カテゴリで、 に移動します。スクリプトするデータの種類
  5. 3つのオプションがあります: スキーマのみ データのみ 、および スキーマとデータ 。適切なオプションを選択して _ ok _ をクリックします。

SSMSから直接、データのCREATE TABLEステートメントとすべてのINSERTステートメントを取得します。

921
Mike Ritacco

このストアドプロシージャを使用します - 特定のテーブルをターゲットにしたり、where句を使用したりできます。テキスト ここ を見つけることができます。

たとえば、それはあなたがこれを行うことができます:

EXEC sp_generate_inserts 'titles'
79
Shane Fulmer

@Mike Ritaccoが述べたがSSMS 2008 R2用に更新

  1. データベース名を右クリック
  2. タスク>スクリプトの生成を選択します。
  3. 設定によっては、紹介ページに表示される場合と表示されない場合があります。
  4. [特定のデータベースオブジェクトを選択]を選択します。
  5. ツリービューを展開して関連テーブルを確認します
  6. 次へをクリック
  7. 詳細設定をクリックします
  8. [一般]セクションの[スクリプトするデータの種類]で適切なオプションを選択します。
  9. ウィザードを完了する

その後、SSMSから直接データのすべてのINSERTステートメントを取得します。

編集2016-10-25 SQL Server 2016/SSMS 13.0.15900.1

  1. データベース名を右クリック

  2. タスク>スクリプトの生成を選択します。

  3. 設定によっては、紹介ページに表示される場合と表示されない場合があります。

  4. [特定のデータベースオブジェクトを選択]を選択します。

  5. ツリービューを展開して関連テーブルを確認します

  6. 次へをクリック

  7. 詳細設定をクリックします

  8. [一般]セクションの[スクリプトするデータの種類]で適切なオプションを選択します。

  9. OKをクリック

  10. 出力を新しいクエリ、クリップボード、またはファイルのどちらに送るかを選択します。

  11. Nextを2回クリック

  12. あなたのスクリプトはあなたが上で選んだ設定に従って準備されます

  13. 完了をクリック

41
noonand

これはVisual Studioを使用しても実行できます(少なくともバージョン2013以降)。

VS 2013では、to filter insertsステートメントの基になっている行のリストも可能です。これは、SSMSでは不可能なことです。

次の手順を実行します。

  • [SQL Serverオブジェクトエクスプローラー]ウィンドウを開きます(メニュー:/ View/SQL Server Object Explorer)
  • データベースとそのテーブルを開く/展開する
  • テーブルを右クリックして、コンテキストメニューから[データの表示]を選択します。
  • これにより、メイン領域にデータが表示されます
  • オプションの手順:フィルターアイコン[データセットの並べ替えとフィルター](結果の上の行の左から4番目のアイコン)をクリックし、1つ以上の列にフィルターを適用します
  • 「スクリプト」または「スクリプトからファイルへ」アイコンをクリックします(一番上の行の右側のアイコン、小さな紙のように見えます)

これにより、選択したテーブルの(条件付き)挿入ステートメントがアクティブウィンドウまたはファイルに作成されます。


Visual Studio 2013の[フィルター]ボタンと[スクリプト]ボタン

enter image description here

39
Martin

SSMS Tools Pack(SQL Server 2005および2008で利用可能)を使用できます。それは挿入ステートメントを生成するための機能が付属しています。

http://www.ssmstoolspack.com/ /

27
BinaryHacker

SSMS 2008バージョン10.0.5500.0を使用しています。スクリプトの生成ウィザードの一部としてのこのバージョンでは、[詳細設定]ボタンの代わりに、以下の画面があります。この場合、挿入されたデータだけが必要で、createステートメントは必要ないので、丸で囲まれた2つのプロパティを変更する必要がありました。Script Options

23
Erikest
13
harriyott

プログラムによるアクセスが必要な場合は、オープンソースのストアドプロシージャ `GenerateInsertを使用できます。

INSERTステートメントジェネレータ

単純で簡単な例として、テーブルAdventureWorks.Person.AddressTypeに対してINSERTステートメントを生成するには、次のステートメントを実行します。

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
9
drumsta

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 
...
8
johnnycrash

この問題に対する私の貢献は、面倒なSSMS GUIを使用せずに複数のテーブルをスクリプト化できるPowershell INSERTスクリプトジェネレータです。 「シード」データをソース管理にすばやく保持するのに最適です。

  1. 以下のスクリプトを "filename.ps1"として保存します。
  2. 「CUSTOMIZE ME」の下の領域に独自の変更を加えます。
  3. スクリプトにテーブルのリストを任意の順序で追加できます。
  4. Powershell ISEでスクリプトを開いて[Play]ボタンを押すか、単にPowershellコマンドの[Prompt]でスクリプトを実行します。

デフォルトでは、生成された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()
7
chuck

挿入を使わず、 _ bcp _ を使う

4
ShuggyCoUk

SQL Server Publishing Wizard http://www.Microsoft.com/downloads/details.aspx?FamilyId=56E5B1C5-BF17-42E0-A410-371A838E570A&displaylang=en を試すことができるかもしれません

挿入ステートメントをスクリプト化するのに役立つウィザードがあります。

4
janem

私はこの script を自分のブログに載せました( SQLサーバでInsertステートメントの手続きを生成する方法 )。

これまでのところ私にはうまくいきましたが、まだ発見していないバグかもしれません。

3
Yordan Georgiev

GenerateData はこのための素晴らしいツールです。ソースコードが利用可能なので、それを微調整するのもとても簡単です。いくつかの素晴らしい機能:

  • 人々の名前と場所のための名前ジェネレータ
  • 世代プロファイルを保存する機能(ダウンロードしてローカルにセットアップした後)
  • スクリプトを介して生成をカスタマイズおよび操作する機能
  • データ用のさまざまな出力(CSV、Javascript、JSONなど)(さまざまな環境でセットをテストする必要があり、データベースアクセスをスキップする場合)
  • フリー 。しかし、あなたがそのソフトウェアが役に立つと思うなら寄付を検討してください:)。

GUI

3
Klik

これを行うにはsqliteを使用します。スクラッチ/テスト用データベースを作成するのに非常に便利です。

sqlite3 foo.sqlite .dump > foo_as_a_bunch_of_inserts.sql

2
Paul Harrington

本番データベースにデータがありますか?もしそうなら、あなたはDTSを介してデータの期間リフレッシュを設定することができます。私たちは週末に毎週私たちのことをやっています、そして私たちのテストのために毎週きれいな、実際のデータを持っていることは非常に素晴らしいです。

まだ本番をお持ちでない場合は、必要なデータベースを作成する必要があります(新鮮)。次に、そのデータベースを複製して、新しく作成したデータベースをテスト環境として使用します。あなたがきれいなバージョンが欲しいときは、単にあなたのきれいなものをもう一度複製してください、そして ボブはあなたのおじです

1
Nick DeVore

Googleスプレッドシートを使用する場合は、 SeekWell を使用してテーブルをシートに送信してから、シートに追加されたとおりに明細表に行を挿入します。

ステップバイステップのプロセスについては こちら を参照、または ビデオデモを見る はこちらの機能の。

1
Thabo

データを使用する前にデータをバックアップしてから、更新したいときに復元するのではないのですか。

インサートを生成する必要がある場合は、試してみてください。 http://vyaskn.tripod.com/code.htm#inserts

0
KM.

私はこれについて多くのことを研究しました、しかし私はこれのための具体的な解決策を得ることができませんでした。現在のアプローチは、SQL Server Managment studioからExcelの内容をコピーして、そのデータをOracle-TOADにインポートしてから挿入ステートメントを生成することです。

0
Vineet Neema

私があなたの質問を正しく理解しているかどうかわからない。

MS-Accessにデータがあり、それをSQL Serverに移動したい場合は、DTSを使用できます。
そして、すべてのINSERTステートメントが実行されているのを確認するためにSQLプロファイラーを使用できると思います。

0
shahkalpesh