Hỏi cách lấy dữ liệu từ SQL Server có so sánh đến dữ liệu trong Sheet
Chào anh em trên diễn đàn
Tôi đang có một vấn đề chưa giải quyết được, nhờ anh em giúp đỡ
– Hiện tại tôi có file Excel (Sheet 1), trong đó có một cột tên là CIFNO (gồm khá nhiều dòng, khoảng vài chục ngàn dòng).
– Dữ liệu cần lấy ở SQL Server, bảng đó (DDMAST) cũng có một cột CIFNO
– Hiện tại tôi lấy dữ liệu bằng cách tạo kết nối tới SQL Server từ Excel, trong Connection Property đặt câu lệnh như sau:
Select * from "BRANCHDATA"."dbo"."DDMAST" where CIFNO in (123,456,789)
Tuy nhiên, điều dở nhất của việc này là tham số trong câu lệnh trên hiện đang để ở dạng "tĩnh" và như vậy, để lấy đủ dữ liệu thì sẽ phải copy tất cả các CIFNO trong Sheet1 lại và past vào đây (điều này làm rất mất công do Sheet 1 có hàng chục ngàn dòng).
Vậy có cách nào để đưa giá trị của cột CIFNO trong Sheet 1 vào thành tham chiếu của câu lệnh kia không, hoặc có thể viết hàm VBA để xử lý việc này không ?
Anh em nào có giải pháp xin hướng dẫn,
2660
Xin chân thành cảm ơn.
Cách dễ nhất để TSQL có thể coi một bảng Excel như một bảng SQL Server là sử dụng OpenRowset
Thay (123, 456, 789) bằng:
( SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 14.0;Database=C:SourceCIFList.xlsx;HDR=NO', 'SELECT F1 FROM [Sheet1$A1:A10000]' )
Cảm ơn bác, ý của bác là thực hiện thao tác từ phía SQL Server ?! Về phía SQL thì dễ nhất là import bảng Excell vào thành một bảng trong SQL (nếu có quyền imporrt :)). Tôi đang muốn tìm phương án để lấy dữ liệu từ màn hình Excel vì khi thao tác trên cửa sổ SQL, nếu kết quả nhiều dòng quá cũng khó kết xuất ra Excel được ?!
Bác thấy cách này của em thế nào?
Giả sử bảng trên SQL của bác là B,
Upload dữ liệu từ sheet1 lên SQL server thành 1 bảng A. Sau đó:
SELECT *
FROM B
WHERE B.CIFNO
IN
( SELECT CIFNO
FROM A
);
Giải pháp này chắc ổn nhưng hiện tại nhà em không có quyền upload dữ liệu lên SQL Server bác ạ (chỉ có quyền view một số bảng), thế nên mới tìm cách lấy dữ liệu từ phía Excel. Trường hợp không xử lý được chắc phải nhờ cán bộ có quyền phía SQL thực hiện thì dùng cách của bác ổn.
Cảm ơn bác.
Mình không biết các lệnh SQL Server, chỉ có thể gợi ý bạn 2 cách
1/ Dùng VBA viết câu lệnh cho các CIFNO trong Sheet1 Select * from "BRANCHDATA"."dbo"."DDMAST" where CIFNO in (…,…,…) và gán vào 1 ô, copy lệnh nầy dán vào …, chạy được không thì không biết
2/ Bạn lấy toàn bộ dữ liệu cho vào mảng sau đó dùng Dictionary để lọc lại theo CIFNO trong Sheet1
Giải pháp này chắc ổn nhưng hiện tại nhà em không có quyền upload dữ liệu lên SQL Server bác ạ (chỉ có quyền view một số bảng), thế nên mới tìm cách lấy dữ liệu từ phía Excel. Trường hợp không xử lý được chắc phải nhờ cán bộ có quyền phía SQL thực hiện thì dùng cách của bác ổn.
Bác dùng SQL SERVER thì cực nhanh luôn, còn làm Excel mà làm kiểu này là chết luôn á
Thứ nhất: câu lệnh trên tôi mách cho TSQL, sử lý qua kết nối từ nơi khác (như trong hình của bạn).
Thứ hai: nếu sử lý trực tiếp từ SQL Server thì cũng chả cần import thành một bảng. Chỉ cần dùng OpenRowset để đọc dữ liệu của file Excel, txt, vv… vào một bảng tạm.
Trong cả hai trường hợp trên, bạn cần được admin cho phép dùng ad hoc query. Và nếu tôi nhớ không lầm thì muốn đọc file Excel, máy chứa SQL Server phải có phần mềm để đọc Office.
Không có đủ quyền thì nói chuyện truy vấn dữ liệu từ nhiều nguồn là chuyện mơ tưởng.
Mình không biết các lệnh SQL Server, chỉ có thể gợi ý bạn 2 cách
Mình không biết các lệnh SQL Server, chỉ có thể gợi ý bạn 2 cách
1/ Dùng VBA viết câu lệnh cho các CIFNO trong Sheet1 Select * from "BRANCHDATA"."dbo"."DDMAST" where CIFNO in (…,…,…) và gán vào 1 ô, copy lệnh nầy dán vào …, chạy được không thì không biết
2/ Bạn lấy toàn bộ dữ liệu cho vào mảng sau đó dùng Dictionary để lọc lại theo CIFNO trong Sheet1
Vấn đề của thớt là nếu bảng DDMAST chứa vài triệu dòng thì câu lệnh trên có thể truy ra một đống dữ liệu. Vài triệu dòng chuyển qua mạng thì cũng hơi lâu.
Thực ra thớt cũng có thể dùng ADO để truy vấn SQL Server, và cái phần CIFNO In… có thể dùng code để đọc Sheet1 và fill vào. Tuy nhiên, vì thớt nói rằng Sheet1 có "hàng chục ngàn dòng" cho nên tôi e rằng cái câu lệnh SQL cuối cùng sẽ dài khủng khiếp.
Bác dùng SQL SERVER thì cực nhanh luôn, còn làm Excel mà làm kiểu này là chết luôn á
Ai chả biết SQL Server nó nhanh. Vậy cũng nói.
(trong SQL Server, nếu tạo được bảng phụ thì dùng INNER JOIN nhanh hơn IN chứ)
www.giaiphapexcel.com/diendan/threads/h%E1%BB%8Fi-c%C3%A1ch-l%E1%BA%A5y-d%E1%BB%AF-li%E1%BB%87u-t%E1%BB%AB-sql-server-c%C3%B3-so-s%C3%A1nh-%C4%91%E1%BA%BFn-d%E1%BB%AF-li%E1%BB%87u-trong-sheet.140802/
Khóa học Power PI – Ứng dung trong Nhân sự
TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...
Xem khóa học