Ich habe SQL Server 2008
, SQL Server Management Studio.
Ich muss Daten aus Table1
in Datenbank1 auswählen. Dann muss ich einige Werte in den Ergebnissen und insert values into Table1
in database2 bearbeiten.
Oder lass es mich anders ausdrücken.
Wie kann ich die Daten in einer Tabelle in insert script
konvertieren?.
SSMS Toolpack (das FREE wie bei Bier ist) bietet eine Vielzahl großartiger Funktionen - einschließlich Generieren von INSERT-Anweisungen aus Tabellen.
Update: für SQL Server Management Studio 2012 (und neuer), SSMS Toolpack ist nicht mehr kostenlos, erfordert jedoch eine bescheidene Lizenzgebühr.
Hier ist eine andere Methode, die in manchen Situationen einfacher ist als das Installieren von Plugins oder externen Tools:
select [whatever you need]
INTO temp.table_name
from [... etc ...]
aus.temp.table_name
im Bildschirm "Choose Objects" aus und klicken Sie auf Weiter.INSERT
-Anweisungen in einem neuen Abfragefenster angezeigt werden.[temp.table_name]
in [your_table_name]
zu ändern.drop table [temp.table_name]
.Native Methode :
zum Beispiel, wenn Sie einen Tisch haben
Users(Id, name)
Du kannst das:
select 'insert into Table values(Id=' + Id + ', name=' + name + ')' from Users
In SSMS:
Klicken Sie mit der rechten Maustaste auf die Datenbank> Aufgaben> Skripts erstellen
Nächster
Wählen Sie "Bestimmte Datenbankobjekte auswählen" und überprüfen Sie die Tabelle, für die Sie ein Skript erstellen möchten, "Weiter"
Klicken Sie in der Liste der Optionen auf Advanced >
, scrollen Sie nach unten, suchen Sie nach "Datentypen für Skript" und ändern Sie die Einstellung in "Nur Daten"> OK
Wählen Sie "In neuem Abfragefenster speichern"> Weiter> Weiter> Fertig stellen
Alle 180 Zeilen jetzt als 180 Insert-Anweisungen geschrieben!
1- Erklärungen zu den Skripten
A) Die Syntax zum Einfügen von Daten in die Tabelle ist wie folgt
Insert into table(col1,col2,col3,col4,col5)
-- To achieve this part i
--have used below variable
[email protected]_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
[email protected]_DATA---
C) Um Daten aus vorhandenen .__ zu erhalten. Tabelle müssen wir das select .__ schreiben. Abfrage so, dass die Ausgabe wird in Form von wie oben genannten Skripten sein
D) Dann habe ich endlich verkettet über der zu erstellenden Variable abschließendes Skript das wird Einfügen-Skript bei der Ausführung erzeugen
E)
@TEXT='SELECT ''INSERT INTO
'[email protected]_NAME+'('[email protected]_COLUMN+')VALUES('''+'+'+SUBSTRING(@QUOTED_DATA,1,LEN(@QUOTED_DATA)-5)+'+'+''')'''+' Insert_Scripts FROM '[email protected]_NAME + @FILTER_CONDITION
F) Und schließlich die obige Abfrage EXECUTE(TEXT)
ausgeführt
G) QUOTENAME()
Funktion wird verwendet, um Spaltenangaben in Anführungszeichen
H) ISNULL
wird verwendet, wenn eine Zeile NULL
.__ hat. Daten für jede Spalte schlägt die Abfrage fehl und NULL
zurückgeben, darum zu vermeiden dass ich ISNULL
verwendet habe
I) und erstellt den sp sp_generate_insertscripts
für dasselbe
1- Geben Sie einfach den Tabellennamen ein, für den Sie möchten insert script
2- Filterbedingung, wenn Sie bestimmte Ergebnisse wünschen
----------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 '[email protected]_NAME+'('[email protected]_COLUMN+')VALUES('''+'+'+SUBSTRING(@QUOTED_DATA,1,LEN(@QUOTED_DATA)-5)+'+'+''')'''+' Insert_Scripts FROM '[email protected]_NAME + @FILTER_CONDITION
--SELECT @CSV_COLUMN AS CSV_COLUMN,@QUOTED_DATA AS QUOTED_DATA,@TEXT TEXT
EXECUTE (@TEXT)
SET NOCOUNT OFF
END
Es ist möglich über Visual Studio SQL Server Object Explorer.
Sie können im Kontextmenü auf "Daten anzeigen" klicken, um die erforderliche Tabelle aufzurufen, die Ergebnisse zu filtern und als Skript zu speichern.
Führen Sie in Visual Studio folgende Schritte aus
Erstellen Sie ein Projekt vom Typ SQL Server -> SQL Server-Datenbankprojekt
Öffnen Sie den SQL Server Explorer CTL- \, CTL-S
fügen Sie einen SQL Server hinzu, indem Sie mit der rechten Maustaste auf das SQL SERVER-Symbol klicken. Auswahl hinzufügen NEUEN SERVER
navigieren Sie zu der Tabelle, an der Sie interessiert sind
rechtsklick -> DATEN ANZEIGEN
Klicken Sie auf die obere linke Zelle, um alles hervorzuheben (ctl-A scheint nicht zu funktionieren)
Rechtsklick -> Skript
Das ist fabelhaft. Ich habe alles, was oben erwähnt wurde, über die Jahre ausprobiert. Ich weiß, dass es ein Werkzeug gibt, das dies tun wird und noch viel mehr, ich kann nicht an den Namen denken. Es ist aber sehr teuer.
Viel Glück. Ich habe es gerade herausgefunden. Habe es nicht ausgiebig mit Textfeldern usw. getestet, aber es sieht so aus, als würde es einen langen Weg hinunter bringen.
Greg
Erstellen Sie eine separate Tabelle mit in Anweisung Zum Beispiel
Wählen Sie * in Test_123 aus [dbo]. [Angestellter], wobei Name wie '% Test%'
Gehen Sie zur Datenbank Klicken Sie mit der rechten Maustaste auf die DatenbankKlicken Sie auf Generate Script Wählen Sie Ihre Tabelle aus.
SQL erzeugt ein Skript für Sie
Sie können die Option 'Ergebnis in Datei' in SSMS auswählen und Ihr Auswahlergebnis in eine Datei exportieren und Ihre Änderungen in der Ergebnisdatei vornehmen. Anschließend können Sie die BCP-Massenkopie in Tabelle 1 in Datenbank 2 einfügen.
Ich denke, für Bulk Insert müssen Sie die .rpt-Datei in die .csv-Datei konvertieren
Ich hoffe es wird helfen.
Dies ist eine vielseitigere Lösung (die etwas mehr kann als die Frage stellt) und kann in einem Abfragefenster verwendet werden, ohne dass eine neue gespeicherte Prozedur erstellt werden muss - nützlich in Produktionsdatenbanken, wenn Sie beispielsweise keinen Schreibzugriff haben .
Um den Code zu verwenden, ändern Sie ihn bitte entsprechend den Kommentaren, die seine Verwendung erläutern. Sie können diese Abfrage dann einfach in einem Abfragefenster ausführen und die von Ihnen benötigten INSERT-Anweisungen drucken.
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
Sie können eine INSERT INTO SELECT
-Anweisung verwenden, um die Ergebnisse einer Auswahlabfrage in eine Tabelle einzufügen. http://www.w3schools.com/sql/sql_insert_into_select.asp
Beispiel:
INSERT INTO Customers (CustomerName, Country) SELECT SupplierName, Country FROM Suppliers WHERE Country='Germany';
Ich hatte ein ähnliches Problem, aber ich musste eine INSERT-Anweisung aus einer Abfrage erstellen können (mit Filtern usw.).
Also habe ich folgendes Verfahren erstellt:
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..'[email protected]);
-- 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 '[email protected]
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
Sie können es dann verwenden, indem Sie die Ausgabe Ihrer Abfrage in eine temporäre Tabelle schreiben und die Prozedur ausführen:
-- 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'
Hinweis: Diese Prozedur wandelt die Werte nur in eine Zeichenfolge um, wodurch die Daten möglicherweise etwas anders aussehen. Bei DATETIME zum Beispiel gehen die Sekunden verloren.
Sie können SQL Server Integration Service-Pakete verwenden, die speziell für Import- und Exportvorgänge entwickelt wurden.
VS bietet ein Paket zum Entwickeln dieser Pakete an, wenn Sie den SQL Server vollständig installieren.
Integrationsdienste im Business Intelligence Development Studio
Ich denke, es ist auch mit Adhoc-Abfragen möglich. Sie können das Ergebnis in eine Excel-Datei exportieren und diese Datei dann in Ihr datierbares Objekt importieren oder sie so wie sie ist verwenden und dann die Excel-Datei in die zweite Datenbank importieren Dieser Link Dies kann Ihnen helfen.
http://vscontrols.blogspot.com/2010/09/import-and-export-Excel-to-sql-server.html
Sie können dieses Q2C.SSMSPlugin verwenden, das kostenlos und Open Source ist. Sie können mit der rechten Maustaste klicken und "Abfrage ausführen" ausführen -> Einzufügende Abfrage ... ". Genießen)
Wenn Sie Oracle verwenden (oder die Anwendung für den SQL Server konfigurieren), übernimmt Oracle SQL Developer dies für Sie. Wählen Sie "Entladen" für eine Tabelle und folgen Sie den Optionen durch (deaktivieren Sie die DDL, wenn Sie nicht möchten, dass die gesamte Tabelle erstellt wird).
Ich habe dieses SMSMS Boost Addon gefunden, das kostenlos ist und genau dies unter anderem macht. Sie können mit der rechten Maustaste auf die Ergebnisse klicken und Skriptdaten als auswählen.
Ich habe folgende procedure
erstellt:
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
Dann kannst du es so benutzen:
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;
Die Ausgabe wäre ungefähr so:
--DBO.CUSTOMER
insert into dbo.customer(id, name, type)
values(1, 'CUSTOMER NAME', 'F');
go
Wenn Sie nur einen Zeilenbereich abrufen möchten, verwenden Sie den @top
-Parameter wie folgt:
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;