SQL Server 2008
SQL Server Management Studio を持っています。
Table1
database1 からデータを選択する必要があります。次に、結果とinsert values into Table1
データベース2のいくつかの値を編集する必要があります。
または別の言い方をさせてください。
1つのテーブルのデータをに変換するにはどうすればよいですかinsert script
。
SQL Server 2008
SQL Server Management Studio を持っています。
Table1
database1 からデータを選択する必要があります。次に、結果とinsert values into Table1
データベース2のいくつかの値を編集する必要があります。
または別の言い方をさせてください。
1つのテーブルのデータをに変換するにはどうすればよいですかinsert script
。
回答:
SSMS Toolpack(ビールのように無料)には、テーブルからのINSERTステートメントの生成など、さまざまな優れた機能があります。
更新: SQL Server Management Studio 2012(およびそれ以降)では、SSMS Toolpackは無料ではなくなりましたが、適度なライセンス料が必要です。
これは別の方法で、状況によってはプラグインや外部ツールをインストールするよりも簡単な場合があります。
select [whatever you need]
INTO temp.table_name
from [... etc ...]
temp.table_name
オブジェクトの選択]画面で選択し、[次へ]をクリックします。INSERT
ステートメントが新しいクエリウィンドウに表示されることを確認します。[temp.table_name]
をに変更し[your_table_name]
ます。drop table [temp.table_name]
。temp
ここでは、アクセスできるスキーマを指します。あなたはどちらか(1を作成することができますcreate schema temp
。単にあなたが現在作業しているものは何でもスキーマを使用(良い))、その後、作業が完了したときにそれを削除、または
SSMSの場合:
データベースを右クリック>タスク>スクリプトを生成
次
[特定のデータベースオブジェクトを選択する]を選択し、スクリプトを作成するテーブルをオンにします。
Advanced >
オプションのリストをクリックし、一番下までスクロールして、「スクリプトを作成するデータのタイプ」を探し、それを「データのみ」に変更します> OK
[新しいクエリウィンドウに保存]> [次へ]> [次へ]> [完了]を選択します
180行すべてが180の挿入ステートメントとして記述されています!
ネイティブメソッド:
たとえば、テーブルがある場合
Users(Id, name)
あなたはこれを行うことができます:
select 'insert into Table values(Id=' + Id + ', name=' + name + ')' from Users
1-スクリプトの説明
A)テーブルにデータを挿入するための構文は次のとおりです
Insert into table(col1,col2,col3,col4,col5)
-- To achieve this part i
--have used below variable
------@CSV_COLUMN-------
values(Col1 data in quote, Col2..quote,..Col5..quote)
-- To achieve this part
-- i.e column data in
--quote i have used
--below variable
----@QUOTED_DATA---
C)既存のテーブルから上記のデータを取得するには、出力が上記のスクリプトの形式になるように選択クエリを記述する必要があります
D)そして最後に、実行時に挿入スクリプトを生成する最終的なスクリプトを作成するために、上記の変数を連結しました
E)
@TEXT='SELECT ''INSERT INTO
'+@TABLE_NAME+'('+@CSV_COLUMN+')VALUES('''+'+'+SUBSTRING(@QUOTED_DATA,1,LEN(@QUOTED_DATA)-5)+'+'+''')'''+' Insert_Scripts FROM '+@TABLE_NAME + @FILTER_CONDITION
F)そして最後に上記のクエリを実行しました EXECUTE(TEXT)
G)QUOTENAME()
関数を使用して、列データを引用符で囲む
H)ISNULL
が使用されているのは、任意の行NULL
に任意の列のデータがある場合、クエリが失敗し、それが返さNULL
れるためです。ISNULL
I)そしてsp_generate_insertscripts
同じのためにsp を作成しました
1-必要なテーブル名を入力するだけ insert script
2-特定の結果が必要な場合はフィルター条件
----------Final Procedure To generate Script------
CREATE PROCEDURE sp_generate_insertscripts
(
@TABLE_NAME VARCHAR(MAX),
@FILTER_CONDITION VARCHAR(MAX)=''
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @CSV_COLUMN VARCHAR(MAX),
@QUOTED_DATA VARCHAR(MAX),
@TEXT VARCHAR(MAX)
SELECT @CSV_COLUMN=STUFF
(
(
SELECT ',['+ NAME +']' FROM sys.all_columns
WHERE OBJECT_ID=OBJECT_ID(@TABLE_NAME) AND
is_identity!=1 FOR XML PATH('')
),1,1,''
)
SELECT @QUOTED_DATA=STUFF
(
(
SELECT ' ISNULL(QUOTENAME('+NAME+','+QUOTENAME('''','''''')+'),'+'''NULL'''+')+'','''+'+' FROM sys.all_columns
WHERE OBJECT_ID=OBJECT_ID(@TABLE_NAME) AND
is_identity!=1 FOR XML PATH('')
),1,1,''
)
SELECT @TEXT='SELECT ''INSERT INTO '+@TABLE_NAME+'('+@CSV_COLUMN+')VALUES('''+'+'+SUBSTRING(@QUOTED_DATA,1,LEN(@QUOTED_DATA)-5)+'+'+''')'''+' Insert_Scripts FROM '+@TABLE_NAME + @FILTER_CONDITION
--SELECT @CSV_COLUMN AS CSV_COLUMN,@QUOTED_DATA AS QUOTED_DATA,@TEXT TEXT
EXECUTE (@TEXT)
SET NOCOUNT OFF
END
Visual Studio SQL Serverオブジェクトエクスプローラーを使用して実行できます。
必要なテーブルのコンテキストメニューから[データの表示]をクリックして、結果をフィルター処理し、結果をスクリプトとして保存できます。
Visual Studioを使用して、次の操作を行います
タイプSQL Serverのプロジェクトを作成-> SQL Serverデータベースプロジェクト
SQLサーバーエクスプローラーCTL-\、CTL-Sを開きます。
SQL SERVERアイコンを右クリックしてSQL Serverを追加します。新しいサーバーを追加
興味のあるテーブルに移動します
右クリック->データの表示
左上のセルをクリックしてすべてを強調表示します(ctl-Aは機能していないようです)
右クリック->スクリプト
これは素晴らしいです。私は何年にもわたって上記のすべてを試しました。これを行うためのツールが世の中にあることは知っていますが、その名前は思いつきません。しかし、それは非常に高価です。
幸運を。私はこれを理解しました。テキストフィールドなどを使用して広範囲にテストしていませんが、長い道のりを進むように見えます。
グレッグ
SSMSで「ファイルに結果」オプションを選択し、選択した結果をファイルにエクスポートして結果ファイルに変更を加え、最後にBCPを使用して、データベース2のテーブル1に挿入できる一括コピーを使用できます。
一括挿入の場合、.rptファイルを.csvファイルに変換する必要があると思います
お役に立てば幸いです。
同様の問題がありましたが、クエリからINSERTステートメントを作成できる必要がありました(フィルターなどを使用)。
だから私は次の手順を作成しました:
CREATE PROCEDURE dbo.ConvertQueryToInsert (@input NVARCHAR(max), @target NVARCHAR(max)) AS BEGIN
DECLARE @fields NVARCHAR(max);
DECLARE @select NVARCHAR(max);
-- Get the defintion from sys.columns and assemble a string with the fields/transformations for the dynamic query
SELECT
@fields = COALESCE(@fields + ', ', '') + '[' + name +']',
@select = COALESCE(@select + ', ', '') + ''''''' + ISNULL(CAST([' + name + '] AS NVARCHAR(max)), ''NULL'')+'''''''
FROM tempdb.sys.columns
WHERE [object_id] = OBJECT_ID(N'tempdb..'+@input);
-- Run the a dynamic query with the fields from @select into a new temp table
CREATE TABLE #ConvertQueryToInsertTemp (strings nvarchar(max))
DECLARE @stmt NVARCHAR(max) = 'INSERT INTO #ConvertQueryToInsertTemp SELECT '''+ @select + ''' AS [strings] FROM '+@input
exec sp_executesql @stmt
-- Output the final insert statement
SELECT 'INSERT INTO ' + @target + ' (' + @fields + ') VALUES (' + REPLACE(strings, '''NULL''', 'NULL') +')' FROM #ConvertQueryToInsertTemp
-- Clean up temp tables
DROP TABLE #ConvertQueryToInsertTemp
SET @stmt = 'DROP TABLE ' + @input
exec sp_executesql @stmt
END
次に、クエリの出力を一時テーブルに書き込み、プロシージャを実行することで、それを使用できます。
-- Example table
CREATE TABLE Dummy (Id INT, Comment NVARCHAR(50), TimeStamp DATETIME)
INSERT INTO Dummy VALUES (1 , 'Foo', GetDate()), (2, 'Bar', GetDate()), (3, 'Foo Bar', GetDate())
-- Run query and procedure
SELECT * INTO #TempTableForConvert FROM Dummy WHERE Id < 3
EXEC dbo.ConvertQueryToInsert '#TempTableForConvert', 'dbo.Dummy'
注:この手順では、値が文字列にキャストされるだけで、データが少し違って見える場合があります。たとえば、DATETIMEの場合、秒は失われます。
これはより用途の広いソリューションであり(質問の回答よりも少し多く機能します)、新しいストアドプロシージャを作成しなくてもクエリウィンドウで使用できます。たとえば、書き込みアクセス権がないプロダクションデータベースで役立ちます。 。
コードを使用するには、その使用方法を説明するインラインコメントに従って変更してください。その後、このクエリをクエリウィンドウで実行するだけで、必要なINSERTステートメントが出力されます。
SET NOCOUNT ON
-- Set the ID you wish to filter on here
DECLARE @id AS INT = 123
DECLARE @tables TABLE (Name NVARCHAR(128), IdField NVARCHAR(128), IdInsert BIT, Excluded NVARCHAR(128))
-- Add any tables you wish to generate INSERT statements for here. The fields are as thus:
-- Name: Your table name
-- IdField: The field on which to filter the dataset
-- IdInsert: If the primary key field is to be included in the INSERT statement
-- Excluded: Any fields you do not wish to include in the INSERT statement
INSERT INTO @tables (Name, IdField, IdInsert, Excluded) VALUES ('MyTable1', 'Id', 0, 'Created,Modified')
INSERT INTO @tables (Name, IdField, IdInsert, Excluded) VALUES ('MyTable2', 'Id', 1, 'Created,Modified')
DECLARE @numberTypes TABLE (sysId TINYINT)
-- This will ensure INT and BIT types are not surrounded with quotes in the
-- resultant INSERT statement, but you may need to add more (from sys.types)
INSERT @numberTypes(SysId) VALUES(56),(104)
DECLARE @rows INT = (SELECT COUNT(*) FROM @tables)
DECLARE @cnt INT = 1
DECLARE @results TABLE (Sql NVARCHAR(4000))
WHILE @cnt <= @rows
BEGIN
DECLARE @tablename AS NVARCHAR(128)
DECLARE @idField AS NVARCHAR(128)
DECLARE @idInsert AS BIT
DECLARE @excluded AS NVARCHAR(128)
SELECT
@tablename = Name,
@idField = IdField,
@idInsert = IdInsert,
@excluded = Excluded
FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS RowId FROM @tables) t WHERE t.RowId = @cnt
DECLARE @excludedFields TABLE (FieldName NVARCHAR(128))
DECLARE @xml AS XML = CAST(('<X>' + REPLACE(@excluded, ',', '</X><X>') + '</X>') AS XML)
INSERT INTO @excludedFields SELECT N.value('.', 'NVARCHAR(128)') FROM @xml.nodes('X') AS T(N)
DECLARE @setIdentity NVARCHAR(128) = 'SET IDENTITY_INSERT ' + @tablename
DECLARE @execsql AS NVARCHAR(4000) = 'SELECT ''' + CASE WHEN @idInsert = 1 THEN @setIdentity + ' ON' + CHAR(13) ELSE '' END + 'INSERT INTO ' + @tablename + ' ('
SELECT @execsql = @execsql +
STUFF
(
(
SELECT CASE WHEN NOT EXISTS(SELECT * FROM @excludedFields WHERE FieldName = name) THEN ', ' + name ELSE '' END
FROM sys.columns
WHERE object_id = OBJECT_ID('dbo.' + @tablename)
FOR XML PATH('')
), 1, 2, ''
) +
')' + CHAR(13) + 'VALUES (' +
STUFF
(
(
SELECT
CASE WHEN NOT EXISTS(SELECT * FROM @excludedFields WHERE FieldName = name) THEN
''', '' + ISNULL(' +
CASE WHEN EXISTS(SELECT * FROM @numberTypes WHERE SysId = system_type_id) THEN '' ELSE ''''''''' + ' END +
'CAST(' + name + ' AS VARCHAR)' +
CASE WHEN EXISTS(SELECT * FROM @numberTypes WHERE SysId = system_type_id) THEN '' ELSE ' + ''''''''' END +
', ''NULL'') + '
ELSE ''
END
FROM sys.columns
WHERE object_id = OBJECT_ID('dbo.' + @tablename)
FOR XML PATH('')
), 1, 3, ''
) +
''')' + CASE WHEN @idInsert = 1 THEN CHAR(13) + @setIdentity + ' OFF' ELSE '' END +
''' FROM ' + @tablename + ' WHERE ' + @idField + ' = ' + CAST(@id AS VARCHAR)
INSERT @results EXEC (@execsql)
DELETE @excludedFields
SET @cnt = @cnt + 1
END
DECLARE cur CURSOR FOR SELECT Sql FROM @results
OPEN cur
DECLARE @sql NVARCHAR(4000)
FETCH NEXT FROM cur INTO @sql
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @sql
FETCH NEXT FROM cur INTO @sql
END
CLOSE cur
DEALLOCATE cur
インポートおよびエクスポート操作用に特別に設計されたSQL Server Integration Serviceパッケージを使用できます。
SQL Serverを完全にインストールした場合、VSにはこれらのパッケージを開発するためのパッケージがあります。
アドホッククエリを使用して、結果をExcelファイルにエクスポートし、そのファイルをデータテーブルオブジェクトにインポートするか、そのまま使用して、2番目のデータベースにExcelファイルをインポートすることも可能だと思います。たくさん。
http://vscontrols.blogspot.com/2010/09/import-and-export-excel-to-sql-server.html
私は以下を作成しましたprocedure
:
if object_id('tool.create_insert', 'P') is null
begin
exec('create procedure tool.create_insert as');
end;
go
alter procedure tool.create_insert(@schema varchar(200) = 'dbo',
@table varchar(200),
@where varchar(max) = null,
@top int = null,
@insert varchar(max) output)
as
begin
declare @insert_fields varchar(max),
@select varchar(max),
@error varchar(500),
@query varchar(max);
declare @values table(description varchar(max));
set nocount on;
-- Get columns
select @insert_fields = isnull(@insert_fields + ', ', '') + c.name,
@select = case type_name(c.system_type_id)
when 'varchar' then isnull(@select + ' + '', '' + ', '') + ' isnull('''''''' + cast(' + c.name + ' as varchar) + '''''''', ''null'')'
when 'datetime' then isnull(@select + ' + '', '' + ', '') + ' isnull('''''''' + convert(varchar, ' + c.name + ', 121) + '''''''', ''null'')'
else isnull(@select + ' + '', '' + ', '') + 'isnull(cast(' + c.name + ' as varchar), ''null'')'
end
from sys.columns c with(nolock)
inner join sys.tables t with(nolock) on t.object_id = c.object_id
inner join sys.schemas s with(nolock) on s.schema_id = t.schema_id
where s.name = @schema
and t.name = @table;
-- If there's no columns...
if @insert_fields is null or @select is null
begin
set @error = 'There''s no ' + @schema + '.' + @table + ' inside the target database.';
raiserror(@error, 16, 1);
return;
end;
set @insert_fields = 'insert into ' + @schema + '.' + @table + '(' + @insert_fields + ')';
if isnull(@where, '') <> '' and charindex('where', ltrim(rtrim(@where))) < 1
begin
set @where = 'where ' + @where;
end
else
begin
set @where = '';
end;
set @query = 'select ' + isnull('top(' + cast(@top as varchar) + ')', '') + @select + ' from ' + @schema + '.' + @table + ' with (nolock) ' + @where;
insert into @values(description)
exec(@query);
set @insert = isnull(@insert + char(10), '') + '--' + upper(@schema + '.' + @table);
select @insert = @insert + char(10) + @insert_fields + char(10) + 'values(' + v.description + ');' + char(10) + 'go' + char(10)
from @values v
where isnull(v.description, '') <> '';
end;
go
次に、そのように使用できます。
declare @insert varchar(max),
@part varchar(max),
@start int,
@end int;
set @start = 1;
exec tool.create_insert @schema = 'dbo',
@table = 'customer',
@where = 'id = 1',
@insert = @insert output;
-- Print one line to avoid the maximum 8000 characters problem
while len(@insert) > 0
begin
set @end = charindex(char(10), @insert);
if @end = 0
begin
set @end = len(@insert) + 1;
end;
print substring(@insert, @start, @end - 1);
set @insert = substring(@insert, @end + 1, len(@insert) - @end + 1);
end;
出力は次のようになります。
--DBO.CUSTOMER
insert into dbo.customer(id, name, type)
values(1, 'CUSTOMER NAME', 'F');
go
行の範囲を取得するだけの場合は、次のように@top
パラメーターを使用します。
declare @insert varchar(max),
@part varchar(max),
@start int,
@end int;
set @start = 1;
exec tool.create_insert @schema = 'dbo',
@table = 'customer',
@top = 100,
@insert = @insert output;
-- Print one line to avoid the maximum 8000 characters problem
while len(@insert) > 0
begin
set @end = charindex(char(10), @insert);
if @end = 0
begin
set @end = len(@insert) + 1;
end;
print substring(@insert, @start, @end - 1);
set @insert = substring(@insert, @end + 1, len(@insert) - @end + 1);
end;
Oracleを使用している(またはアプリケーションをSQL Serverに構成している)場合、Oracle SQL Developerがこれを行います。テーブルの[アンロード]を選択し、オプションに従ってください(すべてのテーブルを作成したくない場合は、DDLをオフにします)。
私はこのSMSMS Boostアドオンを見つけました。これは無料で、とりわけこれを正確に実行します。結果を右クリックして、[スクリプトデータ]を選択できます。
この無料のオープンソースのQ2C.SSMSPluginを使用できます。右クリックして、[コマンドにクエリを実行...->挿入するクエリ...]を選択します。楽しい)
INSERT INTO SELECT
ステートメントを使用して、選択クエリの結果をテーブルに挿入できます。http://www.w3schools.com/sql/sql_insert_into_select.asp
例:
INSERT INTO Customers (CustomerName, Country) SELECT SupplierName, Country FROM Suppliers WHERE Country='Germany';