765 Stimmen

Wie lassen sich INSERT-Anweisungen für eine SQL Server-Tabelle am besten automatisch generieren?

Wir schreiben eine neue Anwendung, und während des Testens benötigen wir eine Reihe von Dummy-Daten. Ich habe diese Daten mithilfe von MS Access hinzugefügt, um Excel-Dateien in die entsprechenden Tabellen zu übertragen.

Von Zeit zu Zeit wollen wir die betreffenden Tabellen "auffrischen", was bedeutet, dass wir sie alle löschen, neu erstellen und eine gespeicherte MS Access-Anhangsabfrage ausführen.

Der erste Teil (Löschen und Neuanlegen) ist ein einfaches SQL-Skript, aber der letzte Teil lässt mich erschaudern. Ich möchte ein einziges Setup-Skript, das eine Reihe von INSERTs hat, um die Dummy-Daten zu regenerieren.

Ich habe die Daten jetzt in den Tabellen. Wie kann ich am besten automatisch eine große Liste von INSERT-Anweisungen aus diesem Datensatz erstellen?

Der einzige Weg, den ich mir vorstellen kann, ist, die Tabelle in einer Excel-Tabelle zu speichern und dann eine Excel-Formel zu schreiben, um für jede Zeile eine EINFÜGE zu erstellen, was sicherlich nicht der beste Weg ist.

Ich verwende das Management Studio 2008, um eine Verbindung zu einer SQL Server 2005-Datenbank herzustellen.

9 Stimmen

Wow, ich habe gerade meine Installation überprüft und du hast Recht, das "Skript Tabelle als" -> "EINFÜGEN" gibt dir nur eine Einfügevorlage, nicht eine Seite mit Einfügungen mit deinen tatsächlichen Daten! Ich hoffe, deine Frage wird beantwortet, denn ich hätte auch gerne eine einfache Möglichkeit, das zu tun, was du fragst.

2 Stimmen

@JosephStyons Ich habe die Frage ein wenig aktualisiert, um sie stark zu vereinfachen und zu verdeutlichen, und um sie relevant zu halten. Diese Frage hat sich zu einer wichtigen Frage auf StackOverflow entwickelt, und es wäre schön, die Arbeitsbelastung für Leute, die hier nach einer Lösung suchen, gering zu halten =) Schauen Sie, ob Sie eine der entfernten Informationen wichtig finden. Wenn Sie Einwände gegen die Änderung haben, können Sie sie gerne zurücknehmen.

1 Stimmen

@EvanCarroll Vielen Dank, Evan. Ich habe es zurückgenommen; ich schlage respektvoll vor, dass einige der Hintergrundinformationen nicht nur für den Kontext nützlich sind, sondern auch, um die Frage mit Suchbegriffen aus der realen Welt zu beantworten. Eine Ihrer Änderungen habe ich beibehalten; ich habe den Absatz über Toad for Oracle weggelassen. Das ist wahrscheinlich nicht sehr hilfreich.

6voto

Klik Punkte 1679

GenerateData ist dafür ein erstaunliches Werkzeug. Es ist auch sehr einfach, Änderungen vorzunehmen, da der Quellcode zur Verfügung steht. Ein paar nette Funktionen:

  • Namensgenerator für Personennamen und Orte
  • Möglichkeit, das Profil der Generation zu speichern (nachdem es heruntergeladen und lokal eingerichtet wurde)
  • Fähigkeit zur Anpassung und Manipulation der Generierung durch Skripte
  • Viele verschiedene Ausgabemöglichkeiten (CSV, Javascript, JSON usw.) für die Daten (für den Fall, dass Sie den Satz in verschiedenen Umgebungen testen müssen und den Datenbankzugriff überspringen wollen)
  • Kostenlos . Aber wenn Sie die Software nützlich finden, sollten Sie spenden :).

GUI

0 Stimmen

Ich hatte noch nie Probleme damit, und ich habe es schon oft benutzt. Vielleicht verwenden Sie nicht die Version, für die die App gedacht ist. Im schlimmsten Fall können Sie eine benutzerdefinierte Ausgabe erstellen, indem Sie die Option "Benutzerdefiniertes HTML-Format verwenden" verwenden. Ich denke, es ist ein ausgezeichnetes Werkzeug.

1 Stimmen

Es ordnet die Typen nicht korrekt zu, und auch die Beispieldaten und die Einfügeanweisung erzeugen falsche Anführungszeichen, ich musste mich durchkämpfen, um einen Großteil des Skripts zu bereinigen. Aber am Ende realisiert dbschema war besser IMHO

0 Stimmen

Interessant, das habe ich nicht gefunden und frage mich, wie Sie es verwenden. Wie auch immer, jedem das Seine.

6voto

TAHA SULTAN TEMURI Punkte 3076

Um eine INSERT-Anweisung mit gefiltertem Datensatz (WHERE QUERY) zu erhalten, können Sie

  1. RECHTSKLICK AUF TABELLE SKRIPTTABELLE ALS > ERSTELLEN BIS > NEUE ABFRAGE

  2. UMBENENNEN IN TEMP_TABLE

  3. JETZT LAUFEN

    SELECT INTO TEMP_TABLE FROM YOURFIRST TABLE WO JETZT IHRE KRITERIEN HIER

Auf diese Weise enthält Ihre temporäre Tabelle nur die gewünschten Datensätze, Führen Sie nun den Skript-Assistenten aus, wie von @Mike Ritacco mit DATA ONLY erhalten Sie die genauen Einfügeanweisungen.

3 Stimmen

Besser und einfacher ist es, die Syntax SELECT INTO NEW_TABLE ohne "CREATE" zu verwenden: w3schools.com/sql/sql_select_into.asp

1 Stimmen

Wird die Tabelle mit Schlüsseln erstellt?

2 Stimmen

Nein, aber für INSERT STATEMENT (Themenfrage) ist es nicht erforderlich.

5voto

janem Punkte 101

Vielleicht können Sie den SQL Server-Veröffentlichungsassistenten ausprobieren http://www.microsoft.com/downloads/details.aspx?FamilyId=56E5B1C5-BF17-42E0-A410-371A838E570A&displaylang=en

Es verfügt über einen Assistenten, der Sie bei der Erstellung von Einfügeanweisungen unterstützt.

0 Stimmen

Es ist vorinstalliert: " C:\Program Dateien (x86) \Microsoft SQL-Server \90\Tools\Publishing\1.4\SqlPubWiz.exe "

5voto

Kamil Nowinski Punkte 411

Sie können generieren INSERT o MERGE Anweisung mit dieser einfachen und kostenlos Anwendung, die ich vor ein paar Jahren geschrieben habe:
Data Script Writer (Desktop-Anwendung für Windows)

enter image description here Außerdem habe ich kürzlich einen Blogbeitrag über diese Tools und den Ansatz zur Nutzung der SSDT für eine Einsatzdatenbank mit Daten. Erfahren Sie mehr:
Skript und Bereitstellung der Daten für die Datenbank aus dem SSDT-Projekt

5voto

Daniel Ribeiro Punkte 304

Ich habe ein einfaches Dienstprogramm erstellt, ich hoffe es gefällt Ihnen.

  • Es müssen keine Objekte in der Datenbank erstellt werden (einfach in der Produktionsumgebung zu verwenden).
  • Sie brauchen nichts zu installieren. Es ist einfach ein normales Skript.
  • Sie benötigen keine besonderen Berechtigungen. Ein normaler Lesezugriff ist ausreichend.
  • Sie können alle Zeilen einer Tabelle kopieren oder WHERE-Bedingungen angeben, damit nur die gewünschten Zeilen erzeugt werden.
  • Sie können eine einzelne oder mehrere Tabellen und verschiedene zu generierende Bedingungsanweisungen angeben.

Wenn die generierten INSERT-Anweisungen abgeschnitten werden, überprüfen Sie die Begrenzung der Textlänge der Ergebnisse in den Management Studio-Optionen: Tools > Options , Query Results > SQL Server > Results to Grid Wert "Non XML data" unter "Maximum Characters Retrieved".

    -- Make sure you're on the correct database
    SET NOCOUNT ON;
    BEGIN TRY
    BEGIN TRANSACTION

    DECLARE @Tables TABLE (
        TableName          varchar(50) NOT NULL,
        Arguments           varchar(1000) NULL
    );

    -- INSERT HERE THE TABLES AND CONDITIONS YOU WANT TO GENERATE THE INSERT STATEMENTS
    INSERT INTO @Tables (TableName, Arguments) VALUES ('table1', 'WHERE field1 = 3101928464');
    -- (ADD MORE LINES IF YOU LIKE) INSERT INTO @Tables (TableName, Arguments) VALUES ('table2', 'WHERE field2 IN (1, 3, 5)');

    -- YOU DON'T NEED TO EDIT FROM NOW ON.
    -- Generating the Script
    DECLARE @TableName  varchar(50),
            @Arguments  varchar(1000),
            @ColumnName varchar(50),
            @strSQL     varchar(max),
            @strSQL2    varchar(max),
            @Lap        int,
            @Iden       int,
            @TypeOfData int;

    DECLARE C1 CURSOR FOR
    SELECT TableName, Arguments FROM @Tables
    OPEN C1
    FETCH NEXT FROM C1 INTO @TableName, @Arguments;
    WHILE @@FETCH_STATUS = 0
    BEGIN

        -- If you want to delete the lines before inserting, uncomment the next line
        -- PRINT 'DELETE FROM ' + @TableName + ' ' + @Arguments

        SET @strSQL = 'INSERT INTO ' + @TableName + ' (';

        -- List all the columns from the table (to the INSERT into columns...)
        SET @Lap = 0;
        DECLARE C2 CURSOR FOR
        SELECT sc.name, sc.type FROM syscolumns sc INNER JOIN sysobjects so ON so.id = sc.id AND so.name = @TableName AND so.type = 'U' WHERE sc.colstat = 0 ORDER BY sc.colorder
        OPEN C2
        FETCH NEXT FROM C2 INTO @ColumnName, @TypeOfData;
        WHILE @@FETCH_STATUS = 0
        BEGIN
            IF(@Lap>0)
            BEGIN
                SET @strSQL = @strSQL + ', ';
            END

            SET @strSQL = @strSQL + '[' + @ColumnName + ']';
            SET @Lap = @Lap + 1;
            FETCH NEXT FROM C2 INTO @ColumnName, @TypeOfData;
        END
        CLOSE C2
        DEALLOCATE C2

        SET @strSQL = @strSQL + ')'
        SET @strSQL2 = 'SELECT ''' + @strSQL + '
SELECT '' + ';

        -- List all the columns from the table again (for the SELECT that will be the input to the INSERT INTO statement)
        SET @Lap = 0;
        DECLARE C2 CURSOR FOR
        SELECT sc.name, sc.type FROM syscolumns sc INNER JOIN sysobjects so ON so.id = sc.id AND so.name = @TableName AND so.type = 'U' WHERE sc.colstat = 0 ORDER BY sc.colorder
        OPEN C2
        FETCH NEXT FROM C2 INTO @ColumnName, @TypeOfData;
        WHILE @@FETCH_STATUS = 0
        BEGIN
            IF(@Lap>0)
            BEGIN
                SET @strSQL2 = @strSQL2 + ' + '', '' + ';
            END

            -- For each data type, convert the data properly
            IF(@TypeOfData IN (55, 106, 56, 108, 63, 38, 109, 50, 48, 52)) -- Numbers
                SET @strSQL2 = @strSQL2 + 'ISNULL(CONVERT(varchar(max), ' + @ColumnName + '), ''NULL'') + '' as ' + @ColumnName + '''';
            ELSE IF(@TypeOfData IN (60, 62)) -- Float Numbers
                SET @strSQL2 = @strSQL2 + 'ISNULL(CONVERT(varchar(max), CONVERT(decimal(18,5), ' + @ColumnName + ')), ''NULL'') + '' as ' + @ColumnName + '''';
            ELSE IF(@TypeOfData IN (61, 111)) -- Datetime
                SET @strSQL2 = @strSQL2 + 'ISNULL( '''''''' + CONVERT(varchar(max),' + @ColumnName + ', 121) + '''''''', ''NULL'') + '' as ' + @ColumnName + '''';
            ELSE IF(@TypeOfData IN (37, 47, 39, 0, 110)) -- Texts
                SET @strSQL2 = @strSQL2 + 'ISNULL('''''''' + RTRIM(LTRIM(' + @ColumnName + ')) + '''''''', ''NULL'') + '' as ' + @ColumnName + '''';
            ELSE -- Unknown data types
                SET @strSQL2 = @strSQL2 + 'ISNULL(CONVERT(varchar(max), ' + @ColumnName + '), ''NULL'') + '' as ' + @ColumnName + '(INCORRECT TYPE ' + CONVERT(varchar(10), @TypeOfData) + ')''';

            SET @Lap = @Lap + 1;
            FETCH NEXT FROM C2 INTO @ColumnName, @TypeOfData;
        END
        CLOSE C2
        DEALLOCATE C2

        SET @strSQL2 = @strSQL2 + ' as [-- ' + @TableName + ']
FROM ' + @TableName + ' WITH (NOLOCK) ' + @Arguments

        SET @strSQL2 = @strSQL2 + ';
';
        --PRINT @strSQL;
        --PRINT @strSQL2;
        EXEC(@strSQL2);

        FETCH NEXT FROM C1 INTO @TableName, @Arguments;
    END
    CLOSE C1
    DEALLOCATE C1

    ROLLBACK
END TRY
BEGIN CATCH
    ROLLBACK TRAN
    SELECT 0 AS Situacao;
    SELECT
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage,
        @strSQL As strSQL,
        @strSQL2 as strSQL2;
END CATCH

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X