Dùng VBA đưa dữ liệu vào SQL Server

Liên hệ QC

MinhKhai

Giải pháp Ếc-xào
Tham gia
16/4/08
Bài viết
934
Được thích
569
Chào các anh chị
Em có tìm được 1 đoạn code VBA để đẩy dữ liệu từ Excel vào database của SQL Server. Hiện em đang gặp vấn đề khi đẩy giá trị thời gian (Cột A trong file đính kèm) vào SQL Server.
Dù đã Google nhưng em vẫn chưa biết dùng hàm chuyển đổi thế nào để vào có thể vào SQL suôn sẻ.
Nhờ các anh chị giúp đỡ. Em xin cảm ơn
 

File đính kèm

  • TestSQL.xlsb
    30.1 KB · Đọc: 110
Cách an toàn nhất để insert date vào SQL Server là dùng Format 'yyyymmdd'
 
Cách an toàn nhất để insert date vào SQL Server là dùng Format 'yyyymmdd'
Với file đính kèm, bác sửa chỗ cần thiết giúp em với.
Dữ liệu trong file đính kèm là được copy từ file .csv nên để việc đẩy vào SQL đc suôn sẻ, chắc phải sửa trong code VBA. Trong SQL Database, em vẫn cần cả ngày lẫn giờ.
 
Giả sử ô trong excel là 19/01/2020. Bạn sử dụng format được bỏ trong cặp dấu ngoặc đơn ‘“ & format(ô,”yyyy-mm-dd”) & “‘ . Mình thêm một biến trong sql thường bỏ trong dấu ngoặc đơn.
 
Giả sử ô trong excel là 19/01/2020. Bạn sử dụng format được bỏ trong cặp dấu ngoặc đơn ‘“ & format(ô,”yyyy-mm-dd”) & “‘ . Mình thêm một biến trong sql thường bỏ trong dấu ngoặc đơn.
Em đã thử như format(ô,”yyyy-mm-dd”) thì đã nhập được. Nhưng em vẫn muốn lấy cả giờ:phút như trong cột A của file Excel bên trên thì làm thế nào ? Nhờ bác chỉ thêm
 
Em đã thử như format(ô,”yyyy-mm-dd”) thì đã nhập được. Nhưng em vẫn muốn lấy cả giờ:phút như trong cột A của file Excel bên trên thì làm thế nào ? Nhờ bác chỉ thêm
Hiện tại mình ở quê, dùng điện thoại nên không thể xem file bạn được, bạn có thể chụp hình cho mình xem nội dung trong file của bạn được không, khai báo biến ngày giờ trong sql của bạn là kiểu gì nhỉ?
 
Em đã thử như format(ô,”yyyy-mm-dd”) thì đã nhập được. Nhưng em vẫn muốn lấy cả giờ:phút như trong cột A của file Excel bên trên thì làm thế nào ? Nhờ bác chỉ thêm

Bạn chỉ cần thêm tham số cho hàm Format() là được rồi.
Format(ô,"yyyymmdd hh:nn:ss")
 
Hiện tại mình ở quê, dùng điện thoại nên không thể xem file bạn được, bạn có thể chụp hình cho mình xem nội dung trong file của bạn được không, khai báo biến ngày giờ trong sql của bạn là kiểu gì nhỉ?
Đúng là em khai báo sai biến. Em đổi lại là Datetime thì được rồi. Cảm ơn anh đã hỗ trợ
Bài đã được tự động gộp:

Bạn chỉ cần thêm tham số cho hàm Format() là được rồi.
Format(ô,"yyyymmdd hh:nn:ss")
Cảm ơn anh. Em đã làm như vậy và đã được rồi.
Em đang tìm hiểu SQL để lưu dữ liệu vào đó thay vì Excel nên cái gì cũng mới. Rất mong được bác hướng dẫn.

Em có thấy trên mạng có 1 đoạn code này chạy trong SSMS, nhưng khi chạy nó báo lỗi về trường ngày tháng. Format ngày tháng trong file .csv có định dạng dd/mm/yyyy h:mm:ss. Vậy em phải convert như thế nào để dữ liệu được nhập đúng vào Database ạ. (Bản chất em muốn tạo 1 thủ tục và gán vào 1 job để định kỳ tự động nạp dữ liệu .csv vào database SQL)

Bulk Insert [Bang]
from 'D:\Hoctap\Testdata.csv'
with
(
Rowterminator = '\n',
Fieldterminator = ','
)

Em cảm ơn các bác
 
Lần chỉnh sửa cuối:
Đúng là em khai báo sai biến. Em đổi lại là Datetime thì được rồi. Cảm ơn anh đã hỗ trợ
Bài đã được tự động gộp:


Cảm ơn anh. Em đã làm như vậy và đã được rồi.
Em đang tìm hiểu SQL để lưu dữ liệu vào đó thay vì Excel nên cái gì cũng mới. Rất mong được bác hướng dẫn.

Em có thấy trên mạng có 1 đoạn code này chạy trong SSMS, nhưng khi chạy nó báo lỗi về trường ngày tháng. Format ngày tháng trong file .csv có định dạng dd/mm/yyyy h:mm:ss. Vậy em phải convert như thế nào để dữ liệu được nhập đúng vào Database ạ. (Bản chất em muốn tạo 1 thủ tục và gán vào 1 job để định kỳ tự động nạp dữ liệu .csv vào database SQL)

Bulk Insert [Bang]
from 'D:\Hoctap\Testdata.csv'
with
(
Rowterminator = '\n',
Fieldterminator = ','
)

Em cảm ơn các bác
Dùng bulk insert vào trực tiếp thì file và bảng phải cùng kiểu dữ liệu, trong trường hợp của bạn bị lỗi thì bạn phải bulk insert vào bảng tạm trước rồi từ bảng tạm này dùng các hàm convert/format... để đưa chuẩn dữ liệu vào bảng gốc
 
Dùng bulk insert vào trực tiếp thì file và bảng phải cùng kiểu dữ liệu, trong trường hợp của bạn bị lỗi thì bạn phải bulk insert vào bảng tạm trước rồi từ bảng tạm này dùng các hàm convert/format... để đưa chuẩn dữ liệu vào bảng gốc
Hi Quân
Với file định Bulk Insert vào SQL Database như đính kèm, bạn soạn cho mình 1 Proc để từ SSMS có thể tự động import dữ liệu vào database với. Cảm ơn bạn
Diễn đàn ko cho phép update với đuôi .csv nên mình phải nén lại thành file .rar

1579518012935.png
 

File đính kèm

  • ExportCashInvoice.rar
    764 bytes · Đọc: 31
Hi Quân
Với file định Bulk Insert vào SQL Database như đính kèm, bạn soạn cho mình 1 Proc để từ SSMS có thể tự động import dữ liệu vào database với. Cảm ơn bạn
Diễn đàn ko cho phép update với đuôi .csv nên mình phải nén lại thành file .rar

View attachment 231329
Bạn tạo bảng tạm có các cột như bảng gốc, có mỗi cột đầu, thay vì datetime thì bạn khai báo là varchar, sau đó bulk insert vào bảng tạm, cuối cùng là insert data từ bảng tạm sang bảng gốc (dunng convert để đưa về đúng kiểu dữ liệu bảng gốc)
 
Với file định Bulk Insert vào SQL Database như đính kèm, bạn soạn cho mình 1 Proc để từ SSMS có thể tự động import dữ liệu vào database với.

Tôi có chỉnh sửa lại cái stored procedure (SP) mà tôi dùng cho "Bulk Insert" nhưng cái Sp này là tôi dùng table tạm của hệ thống SQL Server (#TempTable) chứ không phải Table tạm bạn tạo sẳn trong Database của bạn.
Lưu ý là: muốn BULK INSERT thì User đó phải có quyền Admin của Database nên cẩn trọng trong việc phân quyền thực hiện tính năng này.
Một lưu ý khác là BULK INSERT không dùng được tham số (parameter) nên bạn không thể khai báo tên biến đường dẫn file để đưa vào SP được mà phải dùng SQL động.
Ví dụ: cách này sẽ báo lỗi chỗ tham số @filePath
------------------------------------------
USE [TestDB]
GO
CREATE PROCEDURE [dbo].[ImportCSVFile] (
@filePath VARCHAR(MAX))
AS
BEGIN
CREATE TABLE #TempCSV
(
NGAY_XUAT_HOA_DON Varchar(20),
CACH_THANH_TOAN Varchar(10) NULL,
SO_HOA_DON Varchar(15),
...
)
BULK INSERT #TempCSV
From
@filePath
With (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
FIRSTROW = 2
)
...
END

------------------------------------------------------

Cách đúng: Tạo SP dùng SQL động

Mã:
USE [testDB]
GO

CREATE PROCEDURE [dbo].[ImportCSVFile] (@filePath VARCHAR(MAX))
AS
BEGIN
    CREATE TABLE #TempCSV
    (
        NGAY_XUAT_HOA_DON Varchar(20),
        CACH_THANH_TOAN Varchar(10) NULL,
        SO_HOA_DON Varchar(15),
        MAWB_NO Varchar(15),
        HAWB Varchar(15),
        MO_TA_DICH_VU Varchar(50),
        PHI_DICH_VU Money,
        VAT Float,
        THANH_TIEN Money,
        GIA_TRI_TREN_HOA_DON money,
        DON_VI_XUAT Varchar(15),
        NHAN_VIEN_XUAT_HOA_DON Varchar(30)
    )

DECLARE @SQL NVARCHAR(MAX) = ''
    SET @SQL = N'
    BULK INSERT #TempCSV
      FROM ''' + @filePath + '''
      WITH (
        FIELDTERMINATOR = '','',
        ROWTERMINATOR = ''\n'',
        FIRSTROW=2
      )'

     EXEC sp_executesql @SQL
  
     SELECT * FROM #TempCSV
END

Sau khi tạo stored proc. "ImportCSVFile" xong, bạn chạy câu lệnh này để kiểm tra.
(Tự sửa đường dẫn tới file CSV trên máy bạn)

Mã:
USE [TestDB]
GO

EXEC dbo.ImportCSVFile 'C:\Temp\ExportCashInvoice.csv'


- Cái SP này sẽ Bulk Insert vào table tạm (có dấu thăng "#") của hệ thống (nằm trong: Databases -> System Databases -> tempdb -> Temporary Tables).
- Table tạm này sẽ tự động bị xoá khi phiên kết nối hiện tại (phiên chạy Sp) đóng. Phiên kết nối khác sẽ không nhìn thấy table tạm này.
- Nếu file CSV bạn muốn Insert chỉ có một số Field của một table tổng thôi thì bạn có thể dùng View để chỉ Bulk Insert.
Ví dụ:
--------------------------------------------
Create View HoaDonView
As
Select Ngay_Xuat_Hoa_Don,
Cach_Thanh_Toan,
....
From tblHoaDonTong

--------------------------------------------

==>
--------------------------------------------
Bulk Insert HoaDonView
From ...
With ...

--------------------------------------------
 
Lần chỉnh sửa cuối:
Anh/chị cho em hỏi với ạ.
Em có đẩy dữ liệu từ file CSV lên SQL server, dữ liệu bao gồm thông tin và dư nợ khách hàng. Khi tính tổng dư nợ khách hàng trong SQL lại thấp hơn khi tính tổng ở file CSV. Em đã thử set định dạng là float hoặc numberic thì vẫn ko trả ra kết quả đúng, vẫn bị hụt. Anh/Chị giúp em với. Tks
 
Web KT
Back
Top Bottom