Konvertieren von Auswahlergebnissen in Skript einfügen - SQL Server [geschlossen]

105

Ich habe SQL Server 2008SQL Server Management Studio.

Ich muss Daten aus Table1in Datenbank1 auswählen . Dann muss ich einige Werte in den Ergebnissen und insert values into Table1in der Datenbank2 bearbeiten .

Oder lassen Sie es mich anders sagen.

Wie kann ich die Daten in einer Tabelle in konvertieren insert script.

Captain Comic
quelle
Befinden sich die Datenbanken auf demselben Server? Wenn ja, können Sie von einem in den anderen einfügen. In database2.dbo.myTable
einfügen
Ja, beide Datenbanken befinden sich auf demselben Server. Aber ich brauche ein Skript. Ich werde diese Skripte unserem Datenbank-Typ geben.
Captain Comic
Es würde helfen, die Frage zu klären. Funktioniert ein Ansatz oder benötigen Sie ein Einfügeskript, das Sie an Ihre Datenbank übergeben können?
Greg

Antworten:

30

SSMS Toolpack (das ist KOSTENLOS wie in Bier) hat eine Vielzahl von tollen Funktionen - einschließlich INSERT - Anweisungen zu erzeugen aus Tabellen.

Update: Für SQL Server Management Studio 2012 (und neuer) ist SSMS Toolpack nicht mehr kostenlos, erfordert jedoch eine geringe Lizenzgebühr.

marc_s
quelle
+1 @marc_s Ich habe viel Arbeit geleistet, um solche Einfügeskripte zu erstellen, ohne T-SQL-Generatorskripte zu verwenden, und jetzt sagst du mir, dass es ein Tool gibt.
Bernd_k
Seien Sie vorsichtig , wenn Sie die Tabellen speichern Geld Daten. Diese Datentypen können mehr Dezimalstellen speichern, als normalerweise angezeigt werden oder in den von SSMS Toolpack generierten Skripten
bernd_k
13
Dies ist nicht mehr kostenlos. ssmstoolspack.com/Licensing
greg
@ Greg: Danke, dass du darauf hingewiesen hast. Hinweis: Diese Lizenzierung gilt nur für SQL Server Management Studio 2012 und höher. Für frühere Versionen ist das Toolpack noch kostenlos.
marc_s
4
Alternative zum SSMS Toolpack ?
Kiquenet
153

Hier ist eine andere Methode, die in bestimmten Situationen einfacher sein kann als die Installation von Plugins oder externen Tools:

  • Mach a .select [whatever you need]INTO temp.table_namefrom [... etc ...]
  • Klicken Sie im Objekt-Explorer mit der rechten Maustaste auf die Datenbank => Aufgaben => Skripte generieren
  • Wählen Sie temp.table_nameim Bildschirm "Objekte auswählen" auf Weiter.
  • Im Bildschirm "Festlegen, wie Skripte gespeichert werden sollen":
    • Klicken Sie auf Erweitert, suchen Sie die Eigenschaft "Datentypen in Skript", wählen Sie "Nur Daten" und schließen Sie die erweiterten Eigenschaften.
    • Wählen Sie "In neuem Abfragefenster speichern" (es sei denn, Sie haben Tausende von Datensätzen).
  • Klicken Sie auf Weiter, warten Sie, bis der Auftrag abgeschlossen ist, und beobachten Sie, dass die resultierenden INSERTAnweisungen in einem neuen Abfragefenster angezeigt werden.
  • Verwenden Sie Suchen & Ersetzen, um alle [temp.table_name]zu ändern [your_table_name].
  • drop table [temp.table_name].
KT.
quelle
Die Verwendung von INTO temp.table1 generiert den folgenden Fehler: Der angegebene Schemaname "temp" ist entweder nicht vorhanden oder Sie haben keine Berechtigung, ihn zu verwenden. Ich bin mit SQL 2012
Mark
3
tempHier bezieht sich auf jedes Schema, auf das Sie Zugriff haben. Sie können entweder ein ( create schema temp) erstellen und es dann entfernen, wenn Sie fertig sind, oder (besser) einfach das Schema verwenden, in dem Sie gerade arbeiten.
KT.
1
Danke dafür, ich wusste, dass es einen Weg geben muss! Übrigens können Sie das Erstellen der temporären Tabelle überspringen, wenn Sie nur die gesamten Daten aus der Tabelle benötigen, die Sie skripten möchten.
FAB
Ich musste dies verwenden, um Daten in eine Azure-Datenbank zu importieren. Importieren Sie es in eine Nicht-Azure-Datenbank und extrahieren Sie es als SQL-Einfügungen.
m12lrpv
2
Es wundert mich immer noch, dass SSMS diese Funktion "Ausgabe als Einfügeskript anzeigen" nicht zu den Ergebnismengen hinzugefügt hat. Der obige Ansatz funktioniert jedoch, obwohl er einzelne Einfügebefehle erstellt, anstatt eine ordnungsgemäße Masseneinfügung durchzuführen (z. B. 1.000 Elemente pro Einfügung) ) wie es sollte. Es kann ewig dauern, bis wirklich große Ergebnismengen ausgeführt werden
Traderhut Games
60

In SSMS:

  • Klicken Sie mit der rechten Maustaste auf die Datenbank> Aufgaben> Skripte generieren

  • Nächster

  • Wählen Sie "Bestimmte Datenbankobjekte auswählen" und überprüfen Sie die Tabelle mit dem Skript "Weiter"

  • Klicken Sie Advanced >in die Liste der Optionen, scrollen Sie nach unten und suchen Sie nach den "zu skriptenden Datentypen" und ändern Sie sie in "Nur Daten"> OK

  • Wählen Sie "In neuem Abfragefenster speichern"> Weiter> Weiter> Fertig stellen

Alle 180 Zeilen sind jetzt als 180 Insert-Anweisungen geschrieben!

tember
quelle
12
Nützlich für einige Reihen. Nicht nützlich : Wenn eine Tabelle 20000 Zeilen enthält und ich nur 20 Einfügungen für 20 Zeilen möchte.
Kiquenet
2
@Kiquenet - Sie können zuerst eine Ansicht erstellen, in der die gewünschten 20 Zeilen ausgewählt werden, und dann die folgenden Schritte ausführen, um die Einfügeskripte basierend auf der Ansicht zu erstellen. Sie können dann eine Massensuche durchführen und ersetzen, um den Ansichtsnamen wieder in den Tabellennamen zu ändern, in den Sie ihn einfügen möchten.
2.
@tember Es funktioniert nicht in View, wie Sie sagen, aber es funktioniert in Visual Studio: Zuerst erstellen Sie eine Ansicht mit der erforderlichen Auswahl in SQL Studio, öffnen dann Visual Studio, stellen eine Verbindung zum SQL Server her und generieren ein Skript für diese erstellte Ansicht.
Sergii
Vielen Dank für diese Info. Obwohl das Abladen des gesamten Tisches ein Overkill ist, hat es mein Problem gelöst.
Paulz
Lebensretter. Ich habe mein ganzes Leben lang Skripte geschrieben.
Jay
38

Native Methode :

Zum Beispiel, wenn Sie eine Tabelle haben

Users(Id, name)

Du kannst das:

select 'insert into Table values(Id=' + Id + ', name=' + name + ')' from Users
Andrew Orsich
quelle
Sie können es auf diese Weise tun, aber wenn Sie mehr als ein paar Tabellen haben, wird es ein bisschen tippen. Auf Google sind SPs geschrieben und auffindbar, die dies für Sie tun. Wenn Sie VS2012 haben, können Sie VS dies für Sie tun lassen. Siehe meine Antwort unten.
Greg
1
Nützlich für Tabellen mit wenigen Feldern. Wenn eine Tabelle 50, 60, 100 Spalten enthält, ist dies nicht sinnvoll. Bessere Generation SQL-Code
Kiquenet
23

1- Erklärung der Skripte

A) Die Syntax zum Einfügen von Daten in eine Tabelle lautet wie folgt

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) Um die obigen Daten aus der vorhandenen Tabelle zu erhalten, müssen wir die Auswahlabfrage so schreiben, dass die Ausgabe in Form der obigen Skripte erfolgt

D) Dann habe ich endlich die obige Variable verkettet, um das endgültige Skript zu erstellen, das bei der Ausführung ein Einfügeskript generiert

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) Und schließlich die obige Abfrage ausgeführt EXECUTE(TEXT)

Die QUOTENAME()Funktion G) wird verwendet, um Spaltendaten in Anführungszeichen zu setzen

H) ISNULLwird verwendet, weil, wenn eine Zeile NULL Daten für eine Spalte enthält, die Abfrage fehlschlägt und daher NULLzurückgibt, um zu vermeiden, dass ich verwendet habeISNULL

I) Und erstellte die sp sp_generate_insertscripts dafür

1- Geben Sie einfach den gewünschten Tabellennamen ein 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 '+@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
Param Yadav
quelle
Sie haben einen tollen Job gemacht ...
DineshDB
14

Dies ist über den Visual Studio SQL Server-Objekt-Explorer möglich.

Sie können im Kontextmenü auf "Daten anzeigen" klicken, um die erforderliche Tabelle anzuzeigen, Ergebnisse zu filtern und Ergebnisse als Skript zu speichern.

BotanMan
quelle
1
Ihr Beitrag ist der richtige und einfachste Weg, SQL Server Data Tools in Visual Studio zu verwenden. Hier und hier finden Sie einen Beitrag, in dem erläutert wird, wie die Generierung einer Einfügeanweisung für die ersten 1000 Zeilen hilfreich ist.
Shaijut
8

Gehen Sie mit Visual Studio wie folgt vor

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. Selcet NEUEN SERVER HINZUFÜGEN

Navigieren Sie zu der Tabelle, die Sie interessiert

Rechtsklick -> DATEN ANZEIGEN

Klicken Sie auf die obere linke Zelle, um alles hervorzuheben (ctl-A scheint nicht zu funktionieren).

Rechtsklick -> SCript

Das ist fabelhaft. Ich habe im Laufe der Jahre alles versucht, was oben aufgeführt ist. Ich weiß, dass es da draußen ein Tool gibt, das dies und noch viel mehr kann. Ich kann mir den Namen nicht vorstellen. Aber es ist sehr teuer.

Viel Glück. Ich habe das gerade herausgefunden. Habe es nicht ausgiebig mit Textfeldern usw. getestet, aber es sieht so aus, als würde es dich weit bringen.

Greg

greg
quelle
1
Dies konvertiert keine ausgewählten Ergebnisse, sondern schreibt einfach die Tabelle aus.
Eric K
@QuantumDynamix - Die ursprüngliche Frage wird unten durch "Wie kann ich die Daten in einer Tabelle in ein Skript konvertieren?" Unten finden Sie ein Beispiel für meinen Ansatz. Es ist genau das, was der Benutzer gefragt hat. Tatsächlich ist es die einzige Lösung, die ich sehe, die tatsächlich ein Skript mit Einfügungen erzeugt, wie der Benutzer fragt. Warum das Downvote? Was bedeutet "ausgewählte Ergebnisse nicht konvertieren"? SET IDENTITY_INSERT [PMDB]. [BUAttr] ON INSERT IN [PMDB]. [BUAttr] ([id], [BU], [Name], [Wert]) VALUES (1, N'ALASKA ', N'GeoCenter Lat' , N'67.07213' )
greg
Dies zusammen mit dem Erstellen der temporären Tabellen, tat es für mich
hr-tis
4

Erstellen Sie eine separate Tabelle mit der Anweisung into

Wählen Sie * in Test_123 aus [dbo]. [Mitarbeiter], wobei Name wie '% Test%'

Zur Datenbank gehen Klicken Sie mit der rechten Maustaste auf die Datenbank. Klicken Sie auf Skript generieren. Wählen Sie Ihre Tabelle aus. Wählen Sie die Option advanace und wählen Sie das Attribut "Nur Daten". Wählen Sie die Datei "In neuer Abfrage öffnen".

SQL generiert ein Skript für Sie

KMR
quelle
3

Sie können die Option "Ergebnis in Datei" in SSMS auswählen und Ihr ausgewähltes Ergebnis in eine Datei exportieren und Ihre Änderungen in der Ergebnisdatei vornehmen. Schließlich können Sie BCP - Massenkopie verwenden, die Sie in Tabelle 1 in Datenbank 2 einfügen können.

Ich denke, für Masseneinfügung müssen Sie .rpt-Datei in .csv-Datei konvertieren

Hoffe es wird helfen.

Pankaj Agarwal
quelle
2

Ich hatte ein ähnliches Problem, musste aber in der Lage sein, eine INSERT-Anweisung aus einer Abfrage (mit Filtern usw.) zu erstellen.

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..'+@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

Sie können es dann verwenden, indem Sie die Ausgabe Ihrer Abfrage in eine temporäre Tabelle schreiben und die folgende 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: Bei dieser Prozedur werden die Werte nur in eine Zeichenfolge umgewandelt, wodurch die Daten möglicherweise etwas anders aussehen. Mit DATETIME zum Beispiel gehen die Sekunden verloren.

JollyBrackets
quelle
2

Dies ist eine vielseitigere Lösung (die etwas mehr kann als die Frage stellt) und kann in einem Abfragefenster verwendet werden, ohne dass ein neuer gespeicherter Prozess erstellt werden muss - nützlich in Produktionsdatenbanken, beispielsweise wenn Sie keinen Schreibzugriff haben .

Um den Code zu verwenden, ändern Sie ihn bitte gemäß den Inline-Kommentaren, in denen seine Verwendung erläutert wird. Sie können diese Abfrage dann einfach in einem Abfragefenster ausführen und die gewünschten 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
Neo
quelle
1

Sie können SQL Server Integration Service Packages verwenden, die speziell für den Import- und Exportvorgang entwickelt wurden .

VS verfügt über ein Paket zum Entwickeln dieser Pakete, wenn Sie SQL Server vollständig installieren.

Integration Services im Business Intelligence Development Studio

Jahan
quelle
1

Ich habe folgendes erstellt 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

Dann können Sie es so verwenden:

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 @topZeilenbereich abrufen möchten, verwenden Sie den folgenden Parameter:

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;
Sorack
quelle
Es hilft, aber es hat dieses Feld "6C2A94737A456C405FDCF793DFA6E661: BqRc / DpUIe27" auf "6C2A94737A456C405FDCF793DFA6E6" abgeschnitten
Adam Mendoza
0

Wenn Sie Oracle verwenden (oder die Anwendung für den SQL Server konfigurieren), erledigt Oracle SQL Developer dies für Sie. Wählen Sie "Entladen" für eine Tabelle und folgen Sie den Optionen (deaktivieren Sie "DDL", wenn Sie nicht möchten, dass alle Tabellen erstellt werden).

Liam
quelle
1
Dies ist eindeutig als SQL Server-Frage gekennzeichnet ...
BentOnCoding
Es ist auch möglich, Oracle SQL Developer mit SQL Server zu verwenden. Ich habe meine Antwort bearbeitet.
Liam
0

Ich habe dieses SMSMS Boost Addon gefunden, das kostenlos ist und unter anderem genau dies tut. Sie können mit der rechten Maustaste auf die Ergebnisse klicken und Skriptdaten als auswählen.

DAud
quelle
Ich sehe Skript-Grid-Daten an , generiere aber keine SQL-
Einfügung
0

Sie können dieses Q2C.SSMSPlugin verwenden , das kostenlos und Open Source ist. Sie können mit der rechten Maustaste klicken und "Abfrage zum Befehl ausführen ... -> Abfrage zum Einfügen ..." auswählen. Genießen)

Sergey Petrov
quelle
Gültig für SSMS 2012?
Kiquenet
-1

Sie können eine INSERT INTO SELECTAnweisung verwenden, um die Ergebnisse einer ausgewählten Abfrage 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';
Beschützer eins
quelle
1
Dies hat nichts mit dem Ergebnis einer SELECT-Anweisung zu tun, die in INSERT-Anweisungen konvertiert wird. Dies ist nur eine einfache INSERT-Anweisung.
Niels Lucas
Ist es nicht funktional gleichwertig?
Beschützer