私たちは新しいアプリケーションを書いています、そしてテストしている間、ダミーデータの束が必要になります。 MS Accessを使用してExcelファイルを関連テーブルにダンプすることで、そのデータを追加しました。
多くの場合、関連するテーブルを "更新"します。つまり、それらすべてを削除し、それらを再作成して、保存されたMS Accessの追加クエリを実行します。
最初の部分(削除と再作成)は簡単なSQLスクリプトですが、最後の部分は私を悩ませます。ダミーデータを再生成するための多数のINSERTを含む単一のセットアップスクリプトが必要です。
私は今テーブルのデータを持っています。そのデータセットからINSERTステートメントの大きなリストを自動的に生成するための最善の方法は何ですか?
考えられる唯一の方法は、テーブルをExcelシートに保存してから、Excelの式を作成してすべての行にINSERTを作成することです。これは確実に最良の方法ではありません。
SQL Server 2005データベースに接続するために2008 Management Studioを使用しています。
MicrosoftはSSMS 2008のこの機能を宣伝する必要があります。探している機能は Generate Script ユーティリティに組み込まれていますが、この機能はデフォルトでオフになっているため、テーブルのスクリプト作成時に有効にする必要があります。
これは、SQL Management Studio 2008へのスクリプトやアドインを使用せずに、テーブル内のすべてのデータについてINSERT
ステートメントを生成するための簡単な手順です。
SSMSから直接、データのCREATE TABLE
ステートメントとすべてのINSERT
ステートメントを取得します。
このストアドプロシージャを使用します - 特定のテーブルをターゲットにしたり、where句を使用したりできます。テキスト ここ を見つけることができます。
たとえば、それはあなたがこれを行うことができます:
EXEC sp_generate_inserts 'titles'
@Mike Ritaccoが述べたがSSMS 2008 R2用に更新
その後、SSMSから直接データのすべてのINSERTステートメントを取得します。
編集2016-10-25 SQL Server 2016/SSMS 13.0.15900.1
データベース名を右クリック
タスク>スクリプトの生成を選択します。
設定によっては、紹介ページに表示される場合と表示されない場合があります。
[特定のデータベースオブジェクトを選択]を選択します。
ツリービューを展開して関連テーブルを確認します
次へをクリック
詳細設定をクリックします
[一般]セクションの[スクリプトするデータの種類]で適切なオプションを選択します。
OKをクリック
出力を新しいクエリ、クリップボード、またはファイルのどちらに送るかを選択します。
Nextを2回クリック
あなたのスクリプトはあなたが上で選んだ設定に従って準備されます
完了をクリック
これはVisual Studio
を使用しても実行できます(少なくともバージョン2013以降)。
VS 2013では、to filter insertsステートメントの基になっている行のリストも可能です。これは、SSMSでは不可能なことです。
次の手順を実行します。
これにより、選択したテーブルの(条件付き)挿入ステートメントがアクティブウィンドウまたはファイルに作成されます。
Visual Studio 2013の[フィルター]ボタンと[スクリプト]ボタン:
SSMS Tools Pack(SQL Server 2005および2008で利用可能)を使用できます。それは挿入ステートメントを生成するための機能が付属しています。
SSMS 2008バージョン10.0.5500.0を使用しています。スクリプトの生成ウィザードの一部としてのこのバージョンでは、[詳細設定]ボタンの代わりに、以下の画面があります。この場合、挿入されたデータだけが必要で、createステートメントは必要ないので、丸で囲まれた2つのプロパティを変更する必要がありました。
プログラムによるアクセスが必要な場合は、オープンソースのストアドプロシージャ `GenerateInsertを使用できます。
単純で簡単な例として、テーブル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
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
...
この問題に対する私の貢献は、面倒なSSMS GUIを使用せずに複数のテーブルをスクリプト化できるPowershell INSERTスクリプトジェネレータです。 「シード」データをソース管理にすばやく保持するのに最適です。
デフォルトでは、生成された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()
挿入を使わず、 _ bcp _ を使う
SQL Server Publishing Wizard http://www.Microsoft.com/downloads/details.aspx?FamilyId=56E5B1C5-BF17-42E0-A410-371A838E570A&displaylang=en を試すことができるかもしれません
挿入ステートメントをスクリプト化するのに役立つウィザードがあります。
私はこの script を自分のブログに載せました( SQLサーバでInsertステートメントの手続きを生成する方法 )。
これまでのところ私にはうまくいきましたが、まだ発見していないバグかもしれません。
GenerateData はこのための素晴らしいツールです。ソースコードが利用可能なので、それを微調整するのもとても簡単です。いくつかの素晴らしい機能:
これを行うにはsqliteを使用します。スクラッチ/テスト用データベースを作成するのに非常に便利です。
sqlite3 foo.sqlite .dump > foo_as_a_bunch_of_inserts.sql
本番データベースにデータがありますか?もしそうなら、あなたはDTSを介してデータの期間リフレッシュを設定することができます。私たちは週末に毎週私たちのことをやっています、そして私たちのテストのために毎週きれいな、実際のデータを持っていることは非常に素晴らしいです。
まだ本番をお持ちでない場合は、必要なデータベースを作成する必要があります(新鮮)。次に、そのデータベースを複製して、新しく作成したデータベースをテスト環境として使用します。あなたがきれいなバージョンが欲しいときは、単にあなたのきれいなものをもう一度複製してください、そして ボブはあなたのおじです 。
データを使用する前にデータをバックアップしてから、更新したいときに復元するのではないのですか。
インサートを生成する必要がある場合は、試してみてください。 http://vyaskn.tripod.com/code.htm#inserts
私はこれについて多くのことを研究しました、しかし私はこれのための具体的な解決策を得ることができませんでした。現在のアプローチは、SQL Server Managment studioからExcelの内容をコピーして、そのデータをOracle-TOADにインポートしてから挿入ステートメントを生成することです。
私があなたの質問を正しく理解しているかどうかわからない。
MS-Accessにデータがあり、それをSQL Serverに移動したい場合は、DTSを使用できます。
そして、すべてのINSERTステートメントが実行されているのを確認するためにSQLプロファイラーを使用できると思います。