Làm cách nào để xuất tất cả dữ liệu từ bảng sang định dạng sql có thể chèn?


180

Tôi có Bảng (gọi nó A_table) trong cơ sở dữ liệu (gọi nó A_db) trong Microsoft SQL Server Management Studio và có 10 hàng.

Tôi có một cơ sở dữ liệu khác (gọi nó B_db) và nó có Bảng (gọi nó B_table), có cùng cài đặt cột như A_tableđã có. Nhưng B_tablelà trống rỗng.

Những gì tôi muốn:

  • Sao chép mọi hàng từ A_tableđến B_table.

Có tùy chọn nào trong Microsoft SQL Server Management Studio 2012 , để tạo SQL chèn từ bảng không? Hoặc có bất kỳ lựa chọn khác để làm điều đó?



Câu trả lời:


439

Cách nhanh chóng và dễ dàng:

  1. Nhấp chuột phải vào cơ sở dữ liệu
  2. Chỉ vào tasks In SSMS 2017 you need to ignore step 2 - the generate scripts options is at the top level of the context menuCảm ơn Daniel cho bình luận để cập nhật.
  3. Lựa chọn generate scripts
  4. Nhấn tiếp
  5. Chọn bảng
  6. Nhấn tiếp
  7. Bấm nâng cao
  8. Di chuyển đến Types of data to script- Được gọi types of data to scripttrong SMSS 2014 Cảm ơn Ellesedil đã nhận xét
  9. Lựa chọn data only
  10. Nhấp vào 'Ok' để đóng cửa sổ tùy chọn tập lệnh nâng cao
  11. Nhấp vào tiếp theo và tạo tập lệnh của bạn

Tôi thường trong các trường hợp như thế này tạo ra một cửa sổ soạn thảo truy vấn mới và sau đó chỉ cần thực hiện bất kỳ sửa đổi nào khi cần thiết.


7
Có cách nào để làm điều này và tạo ra các UPDATEcâu lệnh thay vì chèn không?
Alex Kwitny

1
Cảnh báo: công cụ này xuất các giá trị datetime theo định dạng văn hóa cụ thể. Nó có thể không được nhập trên các máy chủ khác
Alexus1024

1
Vâng tuyệt vời. Nhưng .... nó không hoạt động tốt nếu bạn xuất dữ liệu với các giá trị NULL. Bạn sẽ nhận được N '' trong kết quả của mình và các ký tự ở giữa các dấu ngoặc đơn sẽ là số không nhị phân. Điều này sẽ khiến kết quả trở nên vô dụng, bạn sẽ không thể chạy tập lệnh trong SQL Server Management Studio (lỗi chuỗi bị lỗi). Cách duy nhất xung quanh điều này dường như là thay đổi thủ công mọi thứ thành N '' hoặc viết tiện ích thay thế của riêng bạn để lọc các số không (không có trình soạn thảo văn bản nào sẽ xử lý nó vì số 0 chỉ có nghĩa là kết thúc chuỗi).
Martin Maat

Trong SSMS 2017, bạn cần bỏ qua bước 2 - các generate scriptstùy chọn nằm ở cấp cao nhất của menu ngữ cảnh.
Daniel Elkington

1
@AlexKwitny có và không; chỉ với một bảng, bạn có thể "bảng kịch bản dưới dạng ..." - "cập nhật", nhưng với tất cả các bảng, bạn chỉ có thể chọn DROP and CREATEhoặc CREATEtrong cấu hình "Nâng cao". Tôi đang sử dụng SMSS 2019.
WesternGun

14

Tôi biết đây là một câu hỏi cũ, nhưng victorio cũng hỏi liệu có bất kỳ tùy chọn nào khác để sao chép dữ liệu từ bảng này sang bảng khác không. Có một cách rất ngắn và nhanh để chèn tất cả các bản ghi từ bảng này sang bảng khác (có thể có hoặc không có thiết kế tương tự).

Nếu bạn không có cột định danh trong bảng B_table:

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

Nếu bạn có cột định danh trong bảng B_table, bạn phải chỉ định các cột cần chèn. Về cơ bản, bạn chọn tất cả ngoại trừ cột nhận dạng, sẽ được tự động tăng theo mặc định.

Trong trường hợp nếu bạn không có B_table hiện tại trong B_db

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

sẽ tạo bảng B_table trong cơ sở dữ liệu B_db với tất cả các giá trị hiện có


6

Một cách khác để kết xuất dữ liệu dưới dạng tệp từ bảng của spump DumpDataFromTable

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

Lưu ý: SQL phải có quyền tạo tệp, nếu không được thiết lập thì hãy thực hiện theo dòng một lần

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

Theo kịch bản này, bạn có thể gọi sproc: DumpDataFromTable.sql và kết xuất nhiều bảng hơn trong một lần, thay vì thực hiện thủ công từng cái một từ Management Studio

Theo mặc định, định dạng của tập lệnh được tạo sẽ như thế nào

INSERT INTO <TableName> SELECT <Values>

Hoặc bạn có thể thay đổi định dạng được tạo thành

SELECT ... FROM

bằng cách đặt biến @BuildMethod = 2

mã sproc đầy đủ:

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

Hoặc có thể tải xuống phiên bản mới nhất từ https://github.com/Zindur/MSSQL-DumpTable/tree/master/Scripts


Nó không trả lại tất cả các hồ sơ. Tôi đã sao lưu cho một bảng có 3 bản ghi nhưng tạo kịch bản chỉ cho 2
Muhammad Waheed

có một lỗi, những gì tôi đã sửa trên github, xem liên kết
oleg

1

Lệnh để có được bản sao lưu cơ sở dữ liệu từ thiết bị đầu cuối máy linux.

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"

Hy vọng sẽ giúp được ai đó.


0

Chúng ta chỉ cần sử dụng truy vấn bên dưới để kết xuất một dữ liệu bảng vào bảng khác.

Select * into SampleProductTracking_tableDump
from SampleProductTracking;

SampleProductTracking_tableDumplà một bảng mới sẽ được tạo tự động khi sử dụng với truy vấn trên. Nó sẽ sao chép các hồ sơ từ SampleProductTrackingđếnSampleProductTracking_tableDump

nhập mô tả hình ảnh ở đây


Lưu ý rằng đã có một câu trả lời được chấp nhận cho câu hỏi này. Vui lòng chỉnh sửa câu trả lời của bạn để đảm bảo rằng nó cải thiện các câu trả lời khác đã có trong câu hỏi này.
hongsy

-3

Tôi chưa thấy bất kỳ tùy chọn nào trong Microsoft SQL Server Management Studio 2012 cho đến nay sẽ làm điều đó.

Tôi chắc chắn rằng bạn có thể viết một cái gì đó trong T-SQL theo thời gian.

Kiểm tra TOAD từ QUEST - hiện thuộc sở hữu của 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

Một điều thú vị về con cóc, nó hoạt động với cả máy chủ SQL và Oracle. Nếu bạn phải làm việc với cả hai, đó là một khoản đầu tư tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.