Wie exportiere ich alle Daten aus einer Tabelle in ein einfügbares SQL-Format?

180

Ich habe eine Tabelle (call it A_table) in einer Datenbank (call it A_db) in Microsoft SQL Server Management Studio und es gibt 10 Zeilen.

Ich habe eine andere Datenbank (nenne sie B_db) und sie hat eine Tabelle (nenne sie B_table), die die gleichen Spalteneinstellungen wie A_tablehat. Aber das B_tableist leer.

Was ich möchte:

  • Kopieren Sie alle Zeilen von A_tablebis B_table.

Gibt es in Microsoft SQL Server Management Studio 2012 eine Option zum Erstellen einer SQL-Einfügung aus einer Tabelle? Oder gibt es eine andere Möglichkeit, dies zu tun?

victorio
quelle

Antworten:

438

Schneller und einfacher Weg:

  1. Klicken Sie mit der rechten Maustaste auf die Datenbank
  2. Zeigen Sie tasks In SSMS 2017 you need to ignore step 2 - the generate scripts options is at the top level of the context menuDanke an Daniel für den zu aktualisierenden Kommentar.
  3. Wählen generate scripts
  4. Weiter klicken
  5. Wählen Sie Tabellen
  6. Weiter klicken
  7. Klicken Sie auf Erweitert
  8. Scrollen zu Types of data to script- types of data to scriptIn SMSS 2014 aufgerufen Vielen Dank an Ellesedil für den Kommentar
  9. Wählen data only
  10. Klicken Sie auf "OK", um das Fenster mit den erweiterten Skriptoptionen zu schließen
  11. Klicken Sie auf Weiter und generieren Sie Ihr Skript

In solchen Fällen generiere ich normalerweise ein neues Abfrageeditorfenster und nehme dann bei Bedarf Änderungen vor.

Armand
quelle
7
Gibt es eine Möglichkeit, dies zu tun und UPDATEAnweisungen zu generieren , anstatt sie einzufügen?
Alex Kwitny
1
Warnung: Dieses Tool exportiert Datums- / Uhrzeitwerte in einem kulturspezifischen Format. Es kann möglicherweise nicht auf anderen Servern importiert werden
Alexus1024
1
Ja, großartig. Aber ... es funktioniert nicht so gut, wenn Sie Daten mit NULL-Werten exportieren. Sie erhalten N '' in Ihrem Ergebnis und die Zeichen zwischen den einfachen Anführungszeichen sind binäre Nullen. Dadurch wird das Ergebnis unbrauchbar. Sie können das Skript nicht in SQL Server Management Studio ausführen (nicht abgeschlossener Zeichenfolgenfehler). Der einzige Weg, dies zu umgehen, scheint darin zu bestehen, alles manuell in N '' zu ändern oder ein eigenes Ersetzungsdienstprogramm zu schreiben, um die Nullen herauszufiltern (kein Texteditor wird damit umgehen, da Null nur das Ende der Zeichenfolge bedeutet).
Martin Maat
In SSMS 2017 müssen Sie Schritt 2 ignorieren - die generate scriptsOptionen befinden sich auf der obersten Ebene des Kontextmenüs.
Daniel Elkington
1
@AlexKwitny ja und nein; Mit nur einer Tabelle können Sie "Skripttabelle als ..." - "aktualisieren", aber mit allen Tabellen können Sie nur DROP and CREATEoder CREATEin der "Erweiterten" Konfiguration auswählen . Ich benutze SMSS 2019.
WesternGun
14

Ich weiß, dass dies eine alte Frage ist, aber victorio fragte auch, ob es andere Möglichkeiten gibt, Daten von einer Tabelle in eine andere zu kopieren. Es gibt eine sehr kurze und schnelle Möglichkeit, alle Datensätze von einer Tabelle in eine andere einzufügen (die möglicherweise ein ähnliches Design haben oder nicht).

Wenn Sie keine Identitätsspalte in Tabelle B_table haben:

INSERT INTO A_db.dbo.A_table
SELECT * FROM B_db.dbo.B_table

Wenn Sie in der Tabelle B_table eine Identitätsspalte haben, müssen Sie die einzufügenden Spalten angeben. Grundsätzlich wählen Sie alle außer der Identitätsspalte aus, die standardmäßig automatisch inkrementiert wird.

Falls Sie keine B_table in B_db haben

SELECT *
INTO B_db.dbo.B_table
FROM A_db.dbo.A_table

erstellt die Tabelle B_table in der Datenbank B_db mit allen vorhandenen Werten

UY
quelle
6

Eine andere Möglichkeit, Daten als Datei aus einer Tabelle mit DumpDataFromTable sproc zu sichern

EXEC dbo.DumpDataFromTable
     @SchemaName = 'dbo'
    ,@TableName = 'YourTableName'
    ,@PathOut = N'c:\tmp\scripts\' -- folder must exist !!!'

Hinweis: SQL muss über die Berechtigung zum Erstellen von Dateien verfügen. Wenn es nicht eingerichtet ist, führen Sie die folgende Zeile aus

EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE WITH OVERRIDE;

Mit diesem Skript können Sie sproc: DumpDataFromTable.sql aufrufen und mehrere Tabellen auf einmal sichern, anstatt manuell nacheinander in Management Studio zu arbeiten

Standardmäßig ist das Format des generierten Scrips wie folgt

INSERT INTO <TableName> SELECT <Values>

Oder Sie können das generierte Format in ändern

SELECT ... FROM

durch Setzen der Variablen @BuildMethod = 2

vollständiger Sproc-Code:

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DumpDataFromTable]') AND type in (N'P', N'PC'))
    DROP PROCEDURE dbo.[DumpDataFromTable]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:    Oleg Ciobanu
-- Create date: 20171214
-- Version 1.02
-- Description:
-- dump data in 2 formats
-- @BuildMethod = 1 INSERT INTO format
-- @BuildMethod = 2 SELECT * FROM format
--
-- SQL must have permission to create files, if is not set-up then exec follow line once
-- EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE WITH OVERRIDE;
--
-- =============================================
CREATE PROCEDURE [dbo].[DumpDataFromTable]
(
     @SchemaName nvarchar(128) --= 'dbo'
    ,@TableName nvarchar(128) --= 'testTable'
    ,@WhereClause nvarchar (1000) = '' -- must start with AND
    ,@BuildMethod int = 1 -- taking values 1 for INSERT INTO forrmat or 2 for SELECT from value Table
    ,@PathOut nvarchar(250) = N'c:\tmp\scripts\' -- folder must exist !!!'
    ,@AsFileNAme nvarchar(250) = NULL -- if is passed then will use this value as FileName
    ,@DebugMode int = 0
)
AS
BEGIN  
    SET NOCOUNT ON;

        -- run follow next line if you get permission deny  for sp_OACreate,sp_OAMethod
        -- EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE WITH OVERRIDE;

    DECLARE @Sql nvarchar (max)
    DECLARE @SqlInsert nvarchar (max) = ''
    DECLARE @Columns nvarchar(max)
    DECLARE @ColumnsCast nvarchar(max)

    -- cleanUp/prepraring data
    SET @SchemaName = REPLACE(REPLACE(@SchemaName,'[',''),']','')
    SET @TableName = REPLACE(REPLACE(@TableName,'[',''),']','')
    SET @AsFileNAme = NULLIF(@AsFileNAme,'')
    SET @AsFileNAme = REPLACE(@AsFileNAme,'.','_')
    SET @AsFileNAme = COALESCE(@PathOut + @AsFileNAme + '.sql', @PathOut + @SchemaName + ISNULL('_' + @TableName,N'') + '.sql')


    --debug
    IF @DebugMode = 1
        PRINT @AsFileNAme

        -- Create temp SP what will be responsable for generating script files
    DECLARE @PRC_WritereadFile VARCHAR(max) =
        'IF EXISTS (SELECT * FROM sys.objects WHERE type = ''P'' AND name = ''PRC_WritereadFile'')
       BEGIN
          DROP  Procedure  PRC_WritereadFile
       END;'
    EXEC  (@PRC_WritereadFile)
       -- '  
    SET @PRC_WritereadFile =
    'CREATE Procedure PRC_WritereadFile (
        @FileMode INT -- Recreate = 0 or Append Mode 1
       ,@Path NVARCHAR(1000)
       ,@AsFileNAme NVARCHAR(500)
       ,@FileBody NVARCHAR(MAX)   
       )
    AS
        DECLARE @OLEResult INT
        DECLARE @FS INT
        DECLARE @FileID INT
        DECLARE @hr INT
        DECLARE @FullFileName NVARCHAR(1500) = @Path + @AsFileNAme

        -- Create Object
        EXECUTE @OLEResult = sp_OACreate ''Scripting.FileSystemObject'', @FS OUTPUT
        IF @OLEResult <> 0 BEGIN
            PRINT ''Scripting.FileSystemObject''
            GOTO Error_Handler
        END    

        IF @FileMode = 0 BEGIN  -- Create
            EXECUTE @OLEResult = sp_OAMethod @FS,''CreateTextFile'',@FileID OUTPUT, @FullFileName
            IF @OLEResult <> 0 BEGIN
                PRINT ''CreateTextFile''
                GOTO Error_Handler
            END
        END ELSE BEGIN          -- Append
            EXECUTE @OLEResult = sp_OAMethod @FS,''OpenTextFile'',@FileID OUTPUT, @FullFileName, 8, 0 -- 8- forappending
            IF @OLEResult <> 0 BEGIN
                PRINT ''OpenTextFile''
                GOTO Error_Handler
            END            
        END

        EXECUTE @OLEResult = sp_OAMethod @FileID, ''WriteLine'', NULL, @FileBody
        IF @OLEResult <> 0 BEGIN
            PRINT ''WriteLine''
            GOTO Error_Handler
        END     

        EXECUTE @OLEResult = sp_OAMethod @FileID,''Close''
        IF @OLEResult <> 0 BEGIN
            PRINT ''Close''
            GOTO Error_Handler
        END

        EXECUTE sp_OADestroy @FS
        EXECUTE sp_OADestroy @FileID

        GOTO Done

        Error_Handler:
            DECLARE @source varchar(30), @desc varchar (200)       
            EXEC @hr = sp_OAGetErrorInfo null, @source OUT, @desc OUT
            PRINT ''*** ERROR ***''
            SELECT OLEResult = @OLEResult, hr = CONVERT (binary(4), @hr), source = @source, description = @desc

       Done:
    ';
        -- '
    EXEC  (@PRC_WritereadFile) 
    EXEC PRC_WritereadFile 0 /*Create*/, '', @AsFileNAme, ''


    ;WITH steColumns AS (
        SELECT
            1 as rn,
            c.ORDINAL_POSITION
            ,c.COLUMN_NAME as ColumnName
            ,c.DATA_TYPE as ColumnType
        FROM INFORMATION_SCHEMA.COLUMNS c
        WHERE 1 = 1
        AND c.TABLE_SCHEMA = @SchemaName
        AND c.TABLE_NAME = @TableName
    )

    --SELECT *

       SELECT
            @ColumnsCast = ( SELECT
                                    CASE WHEN ColumnType IN ('date','time','datetime2','datetimeoffset','smalldatetime','datetime','timestamp')
                                        THEN
                                            'convert(nvarchar(1001), s.[' + ColumnName + ']' + ' , 121) AS [' + ColumnName + '],'
                                            --,convert(nvarchar, [DateTimeScriptApplied], 121) as [DateTimeScriptApplied]
                                        ELSE
                                            'CAST(s.[' + ColumnName + ']' + ' AS NVARCHAR(1001)) AS [' + ColumnName + '],'
                                    END
                                     as 'data()'                                  
                                    FROM
                                      steColumns t2
                                    WHERE 1 =1
                                      AND t1.rn = t2.rn
                                    FOR xml PATH('')
                                   )
            ,@Columns = ( SELECT
                                    '[' + ColumnName + '],' as 'data()'                                  
                                    FROM
                                      steColumns t2
                                    WHERE 1 =1
                                      AND t1.rn = t2.rn
                                    FOR xml PATH('')
                                   )

    FROM steColumns t1

    -- remove last char
    IF lEN(@Columns) > 0 BEGIN
        SET @Columns = SUBSTRING(@Columns, 1, LEN(@Columns)-1);
        SET @ColumnsCast = SUBSTRING(@ColumnsCast, 1, LEN(@ColumnsCast)-1);
    END

    -- debug
    IF @DebugMode = 1 BEGIN
        print @ColumnsCast
        print @Columns
        select @ColumnsCast ,  @Columns
    END

    -- build unpivoted Data
    SET @SQL = '
    SELECT
        u.rn
        , c.ORDINAL_POSITION as ColumnPosition
        , c.DATA_TYPE as ColumnType
        , u.ColumnName
        , u.ColumnValue
    FROM
    (SELECT
        ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn,
    '
    + CHAR(13) + @ColumnsCast
    + CHAR(13) + 'FROM [' + @SchemaName + '].[' + @TableName + '] s'
    + CHAR(13) + 'WHERE 1 = 1'
    + CHAR(13) + COALESCE(@WhereClause,'')
    + CHAR(13) + ') tt
    UNPIVOT
    (
      ColumnValue
      FOR ColumnName in (
    ' + CHAR(13) + @Columns
    + CHAR(13)
    + '
     )
    ) u

    LEFT JOIN INFORMATION_SCHEMA.COLUMNS c ON c.COLUMN_NAME = u.ColumnName
        AND c.TABLE_SCHEMA = '''+ @SchemaName + '''
        AND c.TABLE_NAME = ''' + @TableName +'''
    ORDER BY u.rn
            , c.ORDINAL_POSITION
    '

    -- debug
    IF @DebugMode = 1 BEGIN
        print @Sql     
        exec (@Sql)
    END

    -- prepare data for cursor

    IF OBJECT_ID('tempdb..#tmp') IS NOT NULL
        DROP TABLE #tmp
    CREATE TABLE #tmp
    (
        rn bigint
        ,ColumnPosition int
        ,ColumnType varchar (128)
        ,ColumnName varchar (128)
        ,ColumnValue nvarchar (2000) -- I hope this size will be enough for storring values
    )
    SET @Sql = 'INSERT INTO  #tmp ' + CHAR(13)  + @Sql

    -- debug
    IF @DebugMode = 1 BEGIN
        print @Sql
    END

    EXEC (@Sql)

 -- Insert dummy rec, otherwise will not proceed the last rec :)
INSERT INTO #tmp (rn)
SELECT MAX(rn) +  1 
FROM #tmp   

    IF @DebugMode = 1 BEGIN
        SELECT * FROM #tmp
    END

    DECLARE @rn bigint
        ,@ColumnPosition int
        ,@ColumnType varchar (128)
        ,@ColumnName varchar (128)
        ,@ColumnValue nvarchar (2000)
        ,@i int = -1 -- counter/flag
        ,@ColumnsInsert varchar(max) = NULL
        ,@ValuesInsert nvarchar(max) = NULL

    DECLARE cur CURSOR FOR
    SELECT rn, ColumnPosition, ColumnType, ColumnName, ColumnValue
    FROM #tmp
    ORDER BY rn, ColumnPosition -- note order is really important !!!
    OPEN cur

    FETCH NEXT FROM cur
    INTO @rn, @ColumnPosition, @ColumnType, @ColumnName, @ColumnValue

    IF @BuildMethod = 1
    BEGIN
        SET @SqlInsert = 'SET NOCOUNT ON;' + CHAR(13);
        EXEC PRC_WritereadFile 1 /*Add*/, '', @AsFileName, @SqlInsert
        SET @SqlInsert = ''
    END
    ELSE BEGIN
        SET @SqlInsert = 'SET NOCOUNT ON;' + CHAR(13);
        SET @SqlInsert = @SqlInsert
                        + 'SELECT *'
                        + CHAR(13) + 'FROM ('
                        + CHAR(13) + 'VALUES'
        EXEC PRC_WritereadFile 1 /*Add*/, '', @AsFileName, @SqlInsert
        SET @SqlInsert = NULL
    END

    SET @i = @rn

    WHILE @@FETCH_STATUS = 0
    BEGIN

        IF (@i <> @rn) -- is a new row
        BEGIN
            IF @BuildMethod = 1
            -- build as INSERT INTO -- as Default
            BEGIN
                SET @SqlInsert = 'INSERT INTO [' + @SchemaName + '].[' + @TableName + '] ('
                                + CHAR(13) + @ColumnsInsert + ')'
                                + CHAR(13) + 'VALUES ('
                                + @ValuesInsert
                                + CHAR(13) + ');'
            END
            ELSE
            BEGIN
                -- build as Table select
                IF (@i <> @rn) -- is a new row
                BEGIN
                    SET @SqlInsert = COALESCE(@SqlInsert + ',','') +  '(' + @ValuesInsert+ ')'
                    EXEC PRC_WritereadFile 1 /*Add*/, '', @AsFileNAme, @SqlInsert
                    SET @SqlInsert = '' -- in method 2 we should clear script
                END            
            END
            -- debug
            IF @DebugMode = 1
                print @SqlInsert
            EXEC PRC_WritereadFile 1 /*Add*/, '', @AsFileNAme, @SqlInsert

            -- we have new row
            -- initialise variables
            SET @i = @rn
            SET @ColumnsInsert = NULL
            SET @ValuesInsert = NULL
        END

        -- build insert values
        IF (@i = @rn) -- is same row
        BEGIN
            SET @ColumnsInsert = COALESCE(@ColumnsInsert + ',','') + '[' + @ColumnName + ']'
            SET @ValuesInsert =  CASE                              
                                    -- date
                                    --WHEN
                                    --  @ColumnType IN ('date','time','datetime2','datetimeoffset','smalldatetime','datetime','timestamp')
                                    --THEN
                                    --  COALESCE(@ValuesInsert + ',','') + '''''' + ISNULL(RTRIM(@ColumnValue),'NULL') + ''''''
                                    -- numeric
                                    WHEN
                                        @ColumnType IN ('bit','tinyint','smallint','int','bigint'
                                                        ,'money','real','','float','decimal','numeric','smallmoney')
                                    THEN
                                        COALESCE(@ValuesInsert + ',','') + '' + ISNULL(RTRIM(@ColumnValue),'NULL') + ''
                                    -- other types treat as string
                                    ELSE
                                        COALESCE(@ValuesInsert + ',','') + '''' + ISNULL(RTRIM( 
                                                                                            -- escape single quote
                                                                                            REPLACE(@ColumnValue, '''', '''''') 
                                                                                              ),'NULL') + ''''         
                                END
        END


        FETCH NEXT FROM cur
        INTO @rn, @ColumnPosition, @ColumnType, @ColumnName, @ColumnValue

        -- debug
        IF @DebugMode = 1
        BEGIN
            print CAST(@rn AS VARCHAR) + '-' + CAST(@ColumnPosition AS VARCHAR)
        END
    END
    CLOSE cur
    DEALLOCATE cur

    IF @BuildMethod = 1
    BEGIN
        PRINT 'ignore'
    END
    ELSE BEGIN
        SET @SqlInsert = CHAR(13) + ') AS vtable '
                        + CHAR(13) + ' (' + @Columns
                        + CHAR(13) + ')'
        EXEC PRC_WritereadFile 1 /*Add*/, '', @AsFileNAme, @SqlInsert
        SET @SqlInsert = NULL
    END
    PRINT 'Done: ' + @AsFileNAme
END

Oder Sie können die neueste Version von https://github.com/Zindur/MSSQL-DumpTable/tree/master/Scripts herunterladen

oleg
quelle
Es werden nicht alle Datensätze zurückgegeben. Ich habe ein Backup für eine Tabelle mit 3 Datensätzen erstellt, aber nur für 2 ein Skript generiert
Muhammad Waheed
Es gibt einen Fehler, den ich auf Github behoben habe, siehe den Link
Oleg
1

Befehl zum Abrufen der Datenbanksicherung vom Linux-Maschinenterminal.

sqlcmd -S localhost -U SA -Q "BACKUP DATABASE [demodb] TO DISK = N'/var/opt/mssql/data/demodb.bak' WITH NOFORMAT, NOINIT, NAME = 'demodb-full', SKIP, NOREWIND, NOUNLOAD, STATS = 10"

Hoffe es hilft jemandem.

Mants
quelle
0

Wir müssen nur die folgende Abfrage verwenden, um Daten einer Tabelle in eine andere Tabelle zu kopieren.

Select * into SampleProductTracking_tableDump
from SampleProductTracking;

SampleProductTracking_tableDumpist eine neue Tabelle, die bei Verwendung mit der obigen Abfrage automatisch erstellt wird. Die Datensätze werden von SampleProductTrackingnach kopiertSampleProductTracking_tableDump

Geben Sie hier die Bildbeschreibung ein

Alok Singh
quelle
Beachten Sie, dass diese Frage bereits akzeptiert wurde. Bitte bearbeiten Sie Ihre Antwort, um sicherzustellen, dass sie andere Antworten verbessert, die bereits in dieser Frage enthalten sind.
Hongsy
-3

Ich habe bisher in Microsoft SQL Server Management Studio 2012 keine Option gesehen, die dies ermöglicht.

Ich bin sicher, dass Sie angesichts der Zeit etwas in T-SQL schreiben können.

Schauen Sie sich TOAD von QUEST an - jetzt im Besitz von DELL.

http://www.toadworld.com/products/toad-for-oracle/f/10/t/9778.aspx

Select your rows.
Rt -click -> Export Dataset.
Choose Insert Statement format
Be sure to check selected rows only

Das Schöne an Kröte ist, dass es sowohl mit SQL Server als auch mit Oracle funktioniert. Wenn Sie mit beiden arbeiten müssen, ist dies eine gute Investition.

CRAFTY DBA
quelle