Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Cara Mengekspor Data ke File Datar dengan Utilitas BCP dan Mengimpor data dengan Sisipan Massal

Utilitas BCP (Bulk Copy Program) di SQL Server memungkinkan administrator database untuk mengimpor data ke dalam tabel dan mengekspor data dari tabel ke file datar. Utilitas BCP juga mendukung berbagai fitur yang memfasilitasi proses ekspor dan impor data massal.

Sekarang mari kita mulai dengan skenario bisnis.

Skenario Bisnis

Katakanlah, kita perlu membagikan laporan bulanan dalam format khusus kepada klien di lokasi bersama yang aman seperti SFTS, yaitu pada awal setiap bulan, kita perlu mengirim file ke klien untuk bulan sebelumnya. Dalam skenario ini, kami akan mencoba membuat prosedur tersimpan untuk menghasilkan data dan mengekspor data tersebut ke file datar (.txt atau .csv).

Bagaimana cara mengimpor dan mengekspor data SQL?

Ada beberapa cara untuk melakukannya:

  • Menggunakan SSMS, Jalankan Kueri di jendela Kueri dan ekspor atau wizard impor &ekspor SQL Server.
  • Menggunakan SSIS – Membuat paket menggunakan SSDT.
  • Menggunakan SSRS.
  • Menggunakan C# – Buat konsol atau menangkan Aplikasi untuk mengekspor.
  • Utilitas BCP.
  • dst.

Apa itu Utilitas BCP?

Utilitas BCP (Bulk copy program) adalah utilitas baris perintah untuk menyalin data antara instance MS SQL Server dan file data dalam format yang ditentukan pengguna. Kami dapat mengekspor dan mengimpor data dalam jumlah besar masuk dan keluar dari database SQL Server dengan cepat dan mudah.

Utilitas BCP melakukan tugas-tugas berikut:

  • Ekspor data massal dari tabel SQL Server ke file data.
  • Ekspor data massal dari kueri/Prosedur Tersimpan.
  • Impor data massal dari file data ke tabel SQL Server.
  • Pembuatan format file.

Anda dapat menemukan detail lebih lanjut tentang Utilitas BCP di sini.

Lingkungan yang digunakan

  • Edisi Pengembang SQL Server 2017
  • Studio manajemen SQL server 2017
  • Contoh database Importir Seluruh Dunia v1.0
  • Utilitas BCP

Cara Mengekspor data ke file datar

Buat prosedur Tersimpan untuk menghasilkan data laporan bulanan.

Pertama, buat objek dependen untuk prosedur Stored export.

Jadi kita harus membuat tabel berikut:

  • The Orders_Monthly_Temp_Table tabel:tabel sementara ini digunakan untuk menyimpan data pesanan bulanan dalam format tertentu untuk mengekspornya ke file teks yaitu dalam kasus kami menggabungkan semua kolom menjadi satu baris dengan pembatas “|”.
  • Export_Config tabel:tabel ini digunakan untuk menyimpan konfigurasi ekspor yaitu jalur folder bersama, jenis file datar, pembatas.

Buat skrip untuk Orders_Monthly_Temp_Table

CREATE TABLE [dbo].[Orders_Monthly_Temp_Table](
    [Row] [varchar](200) NOT NULL
) ON [PRIMARY]

Buat skrip untuk Export_Config

CREATE TABLE [dbo].[Export_Config](
    [Exp_Id] [int] IDENTITY(1,1) NOT NULL,
    [ShareFolder] [varchar](200) NOT NULL,
    [FileType] [varchar](5) NOT NULL,
    [Delimiter] [char](1) NOT NULL,

 CONSTRAINT [PK_Export_Config] PRIMARY KEY CLUSTERED 
(
    [Exp_Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [USERDATA]
) ON [USERDATA]
GO

Memasukkan data ke dalam Export_Config

SET IDENTITY_INSERT [dbo].[Export_Config] ON 
GO
INSERT [dbo].[Export_Config] ([Exp_Id], [ShareFolder], [FileType], [Delimiter]) VALUES (1, N'\\AASHREEPC\FileServer\OrdersMonthly', N'.txt', N'|')
GO
SET IDENTITY_INSERT [dbo].[Export_Config] OFF
GO

Pembuatan &Parameter prosedur tersimpan

  • Di sini parameter tahun dan bulan bersifat opsional.
  • Jika bulan tidak ditentukan maka dibutuhkan bulan sebelumnya dan jika bulan 12 kita harus mengambil tahun sebelumnya, karena jika kita membuat laporan pada jan'2019 untuk Des'2018.
  • Jika tahun tidak ditentukan, dibutuhkan tahun berjalan Dan jalur Folder Wajib.
CREATE PROCEDURE [dbo].[Orders_Monthly_Report] 
    @Month INT = NULL
    ,@Year INT = NULL
    ,@FolderPath VARCHAR(200) 
AS
BEGIN
    SET NOCOUNT ON;
    BEGIN TRY

Validasi Parameter

--#region Parametes validation
        IF NULLIF(@Month, '') IS NULL 
        BEGIN
            SELECT @Month = DATEPART(mm, DATEADD(month, - 1, GETDATE()))

            IF (@Month = 12) –
            BEGIN
                SELECT @Year = DATEPART(Year, GETDATE()) - 1
            END
        END

        IF NULLIF(@Year, '') IS NULL
        BEGIN
            SELECT @Year = DATEPART(Year, GETDATE())
        END

        IF NULLIF(@FolderPath, '') IS NULL  
        BEGIN
            --SELECT @FolderPath = '\\AASHREEPC\FileServer'
            SELECT 'ERROR FolderPath must be specified.'
            RETURN;
        END        
--#endregion Parameters validation

Dapatkan konfigurasi dari tabel ekspor

DECLARE @ExportPath VARCHAR(200)
            ,@Delimiter CHAR(1)
            ,@FileType VARCHAR(5)

        SELECT @ExportPath = TRIM(ShareFolder)
            ,@FileType = TRIM(FileType)
            ,@Delimiter = TRIM(Delimiter)
        FROM dbo.Export_Config

Mendapatkan tanggal mulai dan tanggal akhir bulan

DECLARE @MonthStartDate DATETIME = DATEADD(month, @Month - 1, DATEADD(year, @Year - 1900, 0))
            ,@MonthEndDate DATETIME = DATEADD(day, - 1, DATEADD(month, @Month, DATEADD(year, @Year - 1900, 0)))

Check and Create the temporary table for report data/result
IF NOT EXISTS (
                SELECT *
                FROM sys.objects
                WHERE object_id = OBJECT_ID(N'[dbo].[Orders_Monthly_Temp_Table]')
                    AND type IN (N'U')
                )
        BEGIN
            CREATE TABLE [dbo].Orders_Monthly_Temp_Table ([Row] [varchar](200) NOT NULL) ON [PRIMARY]
        END

Masukkan data ke dalam tabel temp dalam format tertentu yaitu dalam hal ini “| – simbol pipa dipisahkan”

TRUNCATE TABLE Orders_Monthly_Temp_Table
INSERT INTO Orders_Monthly_Temp_Table
        SELECT CAST([OrderID] AS VARCHAR(10)) + ' | ' + CAST(c.[CustomerName] AS VARCHAR(50)) + ' | ' + CAST(p.[FullName] AS VARCHAR(50)) + ' | ' + ISNULL(CAST([PickedByPersonID] AS VARCHAR(4)), '') + ' | ' + CAST(p.[FullName] AS VARCHAR(20)) + ' | ' + ISNULL(CAST([BackorderOrderID] AS VARCHAR(4)), '') + ' | ' + CAST([OrderDate] AS VARCHAR(20)) + ' | ' + CAST([ExpectedDeliveryDate] AS VARCHAR(20)) + ' | ' + CAST([CustomerPurchaseOrderNumber] AS VARCHAR(10)) + ' | ' + CAST([IsUndersupplyBackordered] AS VARCHAR(4)) + ' | ' + ISNULL(CAST([Comments] AS VARCHAR(50)), '') + ' | ' + ISNULL(CAST([DeliveryInstructions] AS VARCHAR(50)), '') + ' | ' + ISNULL(CAST([InternalComments] AS VARCHAR(50)), '') + ' | ' + CAST([PickingCompletedWhen] AS VARCHAR(20)) + ' | ' + CAST(o.[LastEditedBy] AS VARCHAR(4)) + ' | ' + CAST([LastEditedWhen] AS VARCHAR(20)) AS Row
        FROM [WideWorldImporters].[Sales].[Orders] o
        INNER JOIN [Sales].[Customers] c ON o.[CustomerID] = c.[CustomerID]
        INNER JOIN [Application].[People] p ON o.[SalespersonPersonID] = p.[PersonID]
        WHERE OrderDate BETWEEN @MonthStartDate
                AND @MonthEndDate

Kode untuk mengekspor data ke file datar

Buat folder jika tidak ada Menggunakan SQL xp_create_subdir

DECLARE @sql VARCHAR(8000)
            ,@FilePath VARCHAR(200)
            ,@Query VARCHAR(100)
        DECLARE @file_results TABLE (
            file_exists INT
            ,file_is_a_directory INT
            ,parent_directory_exists INT
            )

        SET @FolderPath = @FolderPath + '\' + CAST(@Year AS VARCHAR(10)) + '\' + CAST(@Month AS VARCHAR(10)) + '\'

        INSERT INTO @file_results
        EXEC MASTER.dbo.xp_fileexist @FolderPath

        IF NOT EXISTS (
                SELECT 1
                FROM @file_results
                WHERE file_is_a_directory = 1
                )
            EXEC MASTER.dbo.xp_create_subdir @FolderPath

Membuat file di folder bersama

SET @FilePath = '"' + @FolderPath + '' + 'Orders_Monthly' + '_' + (
                SELECT Format(GETDATE(), N'yyyyMMddHHmmss')
                ) + '.txt"'
        SET @Query = '"SELECT * from ' + (
                SELECT DB_NAME()
                ) + '.dbo.Orders_Monthly_Temp_Table"'

        DECLARE @exe_path10 VARCHAR(200) = ' cd C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\130 & '

        SELECT @sql = @exe_path10 + ' bcp.exe ' + @Query + ' queryout ' + @FilePath + '  -T -c -q -t0x7c -r\n ' --+ @@servername

        EXEC master..xp_cmdshell @sql
    END TRY

    BEGIN CATCH
        SELECT ERROR_NUMBER() AS ErrorNumber
            ,ERROR_STATE() AS ErrorState
            ,ERROR_SEVERITY() AS ErrorSeverity
            ,ERROR_PROCEDURE() AS ErrorProcedure
            ,ERROR_LINE() AS ErrorLine
            ,ERROR_MESSAGE() AS ErrorMessage;
    END CATCH

    SET NOCOUNT OFF;
END

Ubah konteks direktori Anda ke folder tempat BPC Utility berada

[id tabel=58 /]

Melaksanakan prosedur

DECLARE    @return_value int
EXEC    @return_value = [dbo].[Exp_Orders_Monthly_Report]
        @Month = NULL,
        @Year = NULL,
        @FolderPath = NULL
SELECT    'Return Value' = @return_value
GO

Keluaran

Folder tujuan

File Datar Sebenarnya (.txt/.cvs)

Folder bersama harus memiliki Izin ke Akun Virtual “NT SERVICE\MSSQLSERVER”

Klik kanan file atau folder yang ingin Anda atur izinnya → Klik Properties → Klik tab Security. → Klik Edit → Klik Tambah → Ketik NT SERVICE\MSSQLSERVER di kotak nama objek. (jangan klik “Check Names” – jika anda klik Check Names bisa saja anda mendapatkan error 'Sebuah objek bernama “NT SERVICE\MSSQLSERVER” tidak dapat ditemukan.) → Klik OK → pilih akun MSSQLSERVER → Tambahkan izin ( Kontrol penuh) yang diperlukan untuk akun MSSQLSERVER:

Aktifkan 'xp_cmdshell' SQL Server

EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO

Cara Mengimpor Data dari Flat file

Dalam contoh ini, kami menggunakan Sisipkan Massal untuk mengimpor data dari file. Kita juga bisa menggunakan Openrowset dll.

Buat prosedur Tersimpan untuk Mengimpor data dari file datar di folder Bersama.

Pertama, buat objek dependen untuk prosedur impor Tersimpan.

Jadi kita harus membuat tabel berikut

  • Pesanan_Bulanan table:tabel ini digunakan untuk menyimpan data pesanan bulanan dari flat file.
  • Import_Config tabel: tabel ini digunakan untuk menyimpan konfigurasi impor yaitu jalur folder bersama, jenis file datar, pembatas.

CREATE TABLE [dbo].[Orders_Monthly](
    [OrderID] [int] NOT NULL,
    [CustomerName] [varchar](50) NOT NULL,
    [SalespersonPersonName] [varchar](50) NOT NULL,
    [PickedByPersonName] [varchar](50) NULL,
    [ContactPersonName] [varchar](50) NOT NULL,
    [BackorderOrderID] [varchar](4) NULL,
    [OrderDate] [date] NOT NULL,
    [ExpectedDeliveryDate] [date] NOT NULL,
    [CustomerPurchaseOrderNumber] [nvarchar](20) NULL,
    [IsUndersupplyBackordered] [bit] NOT NULL,
    [Comments] [nvarchar](max) NULL,
    [DeliveryInstructions] [nvarchar](max) NULL,
    [InternalComments] [nvarchar](max) NULL,
    [PickingCompletedWhen] [datetime2](7) NULL,
    [LastEditedBy] [int] NOT NULL,
    [LastEditedWhen] [datetime2](7) NOT NULL,
 CONSTRAINT [PK_Orders_Monthly] PRIMARY KEY CLUSTERED 
(
    [OrderID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [USERDATA]
) ON [USERDATA] TEXTIMAGE_ON [USERDATA]
GO

CREATE TABLE [dbo].[Import_Config](
    [Exp_Id] [int] IDENTITY(1,1) NOT NULL,
    [ShareFolder] [nchar](200) NOT NULL,
    [FileType] [varchar](5) NOT NULL,
    [Delimiter] [char](1) NOT NULL
) ON [USERDATA]
GO

Memasukkan data ke dalam Import_Config

SET IDENTITY_INSERT [dbo].[Import_Config] ON 
GO
INSERT [dbo].[Import_Config] ([Exp_Id], [ShareFolder], [FileType], [Delimiter]) VALUES (1, N'\\AASHREEPC\FileServer\OrdersMonthly', N'.txt', N'|')
GO
SET IDENTITY_INSERT [dbo].[Import_Config] OFF
GO

Pembuatan &Parameter prosedur tersimpan

Sama seperti dalam prosedur Tersimpan ekspor.

CREATE PROCEDURE [dbo].[Imp_Orders_Monthly_Report] @Month INT = NULL
    ,@Year INT = NULL
    ,@FolderPath VARCHAR(200) = NULL
AS
BEGIN
    SET NOCOUNT ON;

    BEGIN TRY
Get the configuration from the import table
DECLARE @ImportPath VARCHAR(200)
            ,@Delimiter CHAR(1)
            ,@FileType VARCHAR(5)
            ,@FilePath VARCHAR(200)

        SELECT @ImportPath = TRIM(ShareFolder)
            ,@FileType = TRIM(FileType)
            ,@Delimiter = TRIM(Delimiter)
        FROM dbo.Import_Config

Validasi Parameter

Sama seperti dalam prosedur Tersimpan ekspor.

SET @FolderPath = @ImportPath + '\' + CAST(@Year AS VARCHAR(10)) + '\' + CAST(@Month AS VARCHAR(10)) + '\'
            END
            ELSE
            BEGIN
                --SELECT @FolderPath = '\\AASHREEPC\FileServer\OrdersMonthly'
                SELECT 'ERROR FolderPath must be specified.'

                RETURN;
            END
        END

        --#endregion Parametes validation

Periksa apakah file tersebut ada atau tidak

CREATE TABLE #File (
            FileName SYSNAME
            ,Depth TINYINT
            ,IsFile TINYINT
            );

        INSERT INTO #File (
            FileName
            ,Depth
            ,IsFile
            )
        EXEC xp_DirTree @FolderPath
            ,1
            ,1

        SELECT TOP 1 @FilePath = @FolderPath + '\' + FileName
        FROM #File
        ORDER BY FileName DESC;
        
        IF NULLIF((SELECT TOP 1 FileName FROM #File ORDER BY FileName DESC), '') IS NULL
        BEGIN
                SELECT 'ERROR import File does not exists'
                RETURN;
        END

        DROP TABLE #File
Import the data from the shared folder using Bulk Insert
DECLARE @SQL_BULK VARCHAR(MAX)
        DecLare @Errorlog varchar (Max) = @FolderPath + '\Error.log'
        SET @SQL_BULK = 'BULK
            INSERT [Orders_Monthly]
            FROM ''' + @FilePath + '''
            WITH
            (
                DATAFILETYPE = ''char''
                ,BATCHSIZE = 50000
                ,CODEPAGE = ''RAW''
                ,FIRSTROW = 1
                ,FIELDTERMINATOR = '''[email protected]+'''
                ,ROWTERMINATOR = ''\n''
                ,KEEPNULLS
                ,ERRORFILE = '''+ @Errorlog + '''
                ,MAXERRORS = 20000
                ,TABLOCK
                )'

            EXEC (@SQL_BULK)
END TRY

    BEGIN CATCH
        SELECT ERROR_NUMBER() AS ErrorNumber
            ,ERROR_STATE() AS ErrorState
            ,ERROR_SEVERITY() AS ErrorSeverity
            ,ERROR_PROCEDURE() AS ErrorProcedure
            ,ERROR_LINE() AS ErrorLine
            ,ERROR_MESSAGE() AS ErrorMessage;
    END CATCH

    SET NOCOUNT OFF;
END

Melaksanakan prosedur

DECLARE    @return_value int
EXEC    @return_value = [dbo].[Imp_Orders_Monthly_Report]
        @Month = NULL,
        @Year = NULL,
        @FolderPath = NULL
    SELECT    'Return Value' = @return_value
GO

Keluaran

Verifikasi

Mengotomatiskan proses:

Untuk menjalankan proses ekspor dan impor secara otomatis dalam waktu yang dijadwalkan. katakanlah kita perlu menjalankan ekspor pada hari pertama setiap bulan pada pukul 12:00 setiap bulan untuk laporan bulan terakhir dan menjalankan impor nanti. Jadi kita perlu membuat SQL Job untuk itu.

Langkah-langkah untuk membuat Pekerjaan SQL untuk Ekspor dan impor.

  • Buka MS SQL Server Management Studio →
  • dan Anda harus memiliki “SQL Server Agent” →
  • Perluas “SQL Server Agent” pada Object Explorer. →
  • Klik kanan JOB dan pilih “Pekerjaan Baru…” →
  • Anda dapat melihat jendela “Pekerjaan Baru” dan memasukkan nama =“Orders_Monthly_Export” &Deskripsi

Kemudian masuk ke tab Steps → Klik New Button di bagian bawah → jendela Job Steps baru terbuka → Masukkan Name =“execute [Exp_Orders_Monthly_Report] SP” dan Type =“Transact-SQL Script (T-SQL)” → Paste script berikut di area teks Perintah dan Klik OK.

USE [WideWorldImporters]
GO
DECLARE    @return_value int+
EXEC    @return_value = [dbo].[Exp_Orders_Monthly_Report]
        @Month = NULL,
        @Year = NULL,
        @FolderPath = NULL
SELECT    'Return Value' = @return_value
GO

Kemudian Buka tab Jadwal → Klik Tombol Baru di bagian bawah → jendela Jadwal pekerjaan baru terbuka. Masukkan Name =“Order Monthly Schedule” dan masukkan detail berikut dan Klik OK → Sekali lagi Klik OK di jendela New Job.

Pekerjaan akan berhasil dibuat.

Uji Pekerjaan SQL:

Hapus semua file di folder Bersama untuk pengujian.

Untuk menjalankan pekerjaan secara manual untuk pengujian:Klik Kanan pada Pekerjaan yang Baru dibuat → Klik ‘Mulai Pekerjaan pada langkah..’ dan kita dapat melihat pekerjaan yang sedang berjalan

Kita bisa melihat file tersebut dibuat di folder Shared.

Catatan:Ikuti langkah-langkah di atas untuk membuat tugas SQL (Orders_Monthly_Import) untuk Impor juga.

Saya harap sekarang Anda memiliki pemahaman yang lebih baik tentang cara menggunakan utilitas BCP.

Alat yang berguna:

dbForge Data Pump – add-in SSMS untuk mengisi database SQL dengan data sumber eksternal dan memigrasikan data antar sistem.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Migrasi Database ke Azure SQL Database

  2. Logging Minimal dengan INSERT…PILIH ke Tabel Cluster Kosong

  3. Model Relasional

  4. Pengantar Azure Tanpa Server

  5. Menggunakan RStudio dengan Versi Non-Sistem dari Manajer Driver unixODBC