wake-up-neo.net

Konvertieren von Select-Ergebnissen in Einfügungsskript - SQL Server

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?.

67
Captain Comic

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.

23
marc_s

Hier ist eine andere Methode, die in manchen Situationen einfacher ist als das Installieren von Plugins oder externen Tools:

  • Führen Sie einen select [whatever you need]INTO temp.table_namefrom [... etc ...] aus.
  • Klicken Sie im Objekt-Explorer mit der rechten Maustaste auf die Datenbank => Aufgaben => Skripts generieren
  • Wählen Sie temp.table_name im Bildschirm "Choose Objects" aus und klicken Sie auf Weiter.
  • Im Bildschirm "Festlegen, wie Skripts gespeichert werden sollen":
    • Klicken Sie auf Erweitert, suchen Sie die Eigenschaft "Datentypen für Skript", wählen Sie "Nur Daten" und schließen Sie die erweiterten Eigenschaften.
    • Wählen Sie "In neuem Abfragefenster speichern" (sofern Sie nicht Tausende von Datensätzen haben).
  • Klicken Sie auf Weiter, warten Sie, bis der Job abgeschlossen ist. Beachten Sie, dass die resultierenden INSERT-Anweisungen in einem neuen Abfragefenster angezeigt werden.
  • Verwenden Sie Suchen und Ersetzen, um alle [temp.table_name] in [your_table_name] zu ändern.
  • drop table [temp.table_name].
94
KT.

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
34
Andrew Orsich

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!

26
tember

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
8
Param Yadav

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.

8
BotanMan

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

8
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

3
KMR

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.

3
Pankaj Agarwal

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
2
Neo

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';
1
Protector one

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.

1
JollyBrackets

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

1
Jahan Zinedine

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

1
JSJ

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)

0
Sergey Petrov

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).

0
Liam

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.

0
DAud

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;
0
Sorack