Hỏi cách lấy dữ liệu từ SQL Server có so sánh đến dữ liệu trong Sheet

Liên hệ QC

gen_bidv

Thành viên mới
Tham gia
5/3/08
Bài viết
7
Được thích
1
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,

Xin chân thành cảm ơn.
 

File đính kèm

  • Connection.jpg
    Connection.jpg
    105.5 KB · Đọc: 28
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:\Source\CIFList.xlsx;HDR=NO', 'SELECT F1 FROM [Sheet1$A1:A10000]' )
 
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:\Source\CIFList.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 ?!
 
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,

Xin chân thành cảm ơn.
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 đó:

Mã:
SELECT *

FROM B

WHERE B.CIFNO

IN

( SELECT CIFNO

  FROM A

);
 
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 đó:

Mã:
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.
 
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,

Xin chân thành cảm ơn.
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.
Cảm ơn bác.
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 á
 
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 ?!
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
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ứ)
 
Web KT
Back
Top Bottom