Nhờ hướng dẫn kết nối Excel bằng Code VBA với “2 CSDL trong SQL”

Chia sẻ bởi:hands
★★★★★
Quảng cáo

Hiện tại e đang kết nối excel với 1 CSDL SQL nhưng dữ liệu chưa đầy đủ, vì chỗ e chạy tới 2 database. E muốn là kết nối thêm 1 CSDL nữa vào code VBA, tức là kết nối 2 CSDL chạy cùng lúc có được không ạ.
2620
ae nào biết chỉ giúp e với. Tks

Nếu bạn đã dùng code kết nối được 1 CSDL, thì kết nối được 2 CSDL. Khi đã kết nối 2 hoặc nhiều table/ query trong 2 CSDL thì nếu tạo được quan hệ giữa chúng, hoàn toàn có thể xử lý. Ví dụ như Select join các bảng tạm.

Bạn có thể nói rõ hơn được không. 2csdl thì table giống nhau hết. Chỉ có kết nối 2 csdl lại để lấy DL đầy đủ thôi ạ
2621

Nếu giống cấu trúc 100% thì 1 là copy recordset thứ 2 xuống dưới cái thứ nhất (tìn dòng cuối và + 1), 2 là xuống sheet thứ 2 sau đó union 2 bảng ở 2 sheet

Khi kết nối, chuỗi kết nói cần nêu rõ một CSDL làm gốc để nó nối vào.
Nếu có nhiếu sheets trogn mọt file hì nó coi như đó là nhiều bảng (tables) trong một CSDL.
Khi cần lấy từ một workbook khác thì cái workbook thứ hai được coi là một CSDL khác. Tuy không phải sửa lại chuỗi kết nối, nhưng cái CSDL thứ hai cũng cần phải nêu rõ tính chất. Thường

Tìm cúng trong góc này, các bài viết và bài tâooj của HLMT sẽ thấy cách đưa bảng của CSDL thứ hai vào câu truy vấn.

Bên tôi cũng có nhiều server, nên thường tôi connect các server trong SQL như vầy, câu select đầu là của server hiện hành, câu sau là server khác, không biết ADO có thể connect như vậy được không nhưng Power query tôi vẫn connect bình thường được, nếu chỉ connect các database trong một server thì bỏ cái địa chỉ server là được
2622

Nối được. Tuy nhiên, ADO dùng cỗ máy Access để truy vấn file Excel. Câu SQL khi nối gián tiếp qua workbook khác cũng phải theo luật của Access.

kết nối 2 CSDL chạy cùng lúc có được không

Chạy cùng lúc thì chắc đợi siêu máy tính may ra.
Phạm vi thông thường thì cùng lắm 2 anh chạy liền kề nhau, một anh trước, một anh sau.

Mình úp vài files dữ liệu đang làm lên, minh họa kết quả mong muốn có khi xong từ sáng nay rồi.

Thớt nói chuyện lủng củng bỏ bố.
Giới trẻ người Việt có tật nói tắt bằng cách cắt bớt tên của người ta. Khi nói về SQL Server, họ tự cắt bớt thành SQL, không cần biết rằng SQL là tên của ngôn ngữ truy vấn.

Rốt cuộc, tôi cũng chẳng rõ thớt muốn gì trong mấy thứ sau đây:
1. có hai SQL Server's. Dùng VBA trong Excel truy vấn Databases trong cả hai Servers bằng cách kết nối với cả hai cùng một lúc.
2. có một SQL Server, chứa nhiều Databases. Dùng VBA trong Excel kết nối với Server trên, và truy vấn hai Databases trong Server ấy cùng một lúc.
3. có ba Excel workbooks. Dùng VBA trong một workbook, kết nối và truy vấn cả hai workbooks còn lại cùng một lúc.
4. có cái gì đó ông nội tôi cũng đoán không nổi.

Cả 3 điều trên đều khả thi. Tuy rằng điều 1 và 2 phải có phép của admin mới làm được. Nếu công ty xài SQL Server mà không có admin, buộc người dùng phải tự làm lấy mọi thứ thì đáng lẽ người dùng phải ở trình độ giỏi hơn tôi, đâu cần phải hỏi cái vặt vãnh này.

Nếu truy vấn Excel thì code dạng như sau. Nếu là SQL Server chắc cũng tương tự, mình chưa thử.

Sub test()
    Dim cnn As ADODB.Connection, rs As ADODB.Recordset
    Dim ConnectionString As String, SQLString As String
    Set cnn = New ADODB.Connection
    ConnectionString = _
        "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "a.xlsx" & ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
    cnn.Open ConnectionString
    Set rs = New ADODB.Recordset
    SQLString = "SELECT a.* FROM [Sheet1$] UNION ALL SELECT * FROM [Excel 12.0 Xml;HDR=YES;Database=" & ThisWorkbook.Path & "b.xlsx" & ";].[Sheet1$]"
    rs.Open SQLString, cnn
    Sheet1.Range("A2").CopyFromRecordset rs
    rs.Close
    Set rs = Nothing
    cnn.Close
    Set cnn = Nothing
End Sub

code này lỗi khi chạy … tham khảo thêm… thấy code kiểu truy vấn 2 Data trên VB6 đầy ra
stackoverflow.com/questions/38555156/using-vba-excel-for-an-sql-query-across-multiple-databases']Using VBA-Excel for an SQL query across multiple databases – Stack Overflow

Mình nhầm, cần sửa SELECT a.* thành SELECT *, do mình sửa code join 2 bảng không chạy thử.

Bái phục các chuyên gia nhà mình, cả bài mà không có cái file đính kèm nào mà code két vẫn ầm ầm. :clap2:
Bạn @Hau151978 đính kèm file cho OT coi xem nó như thế nào với Bạn ơi… :rolleyes:

Cũng chỉ coi code chứ làm sao chạy thử, trên máy có .. không mà đòi.

Cả 3 điều trên đều khả thi. Tuy rằng điều 1 và 2 phải có phép của admin mới làm được. Nếu công ty xài SQL Server mà không có admin, buộc người dùng phải tự làm lấy mọi thứ thì đáng lẽ người dùng phải ở trình độ giỏi hơn tôi, đâu cần phải hỏi cái vặt vãnh này.

Bài 1 có cái hình VBA excel truy cập vào database gì không rõ, thấy Provider = sqloledb
có Initial Catalog, UserID và password nhưng bị bôi đen thùi lùi.
Tôi đang nghi ngờ câu SQL trong hình bài 1 đó không chạy được.

Với 2 DBase trong cùng một thể trạng (instance) SQL Server thì lúc kết nối cần nêu cái DBase chính để kết nối. Và sau đó câu T-SQL chỉ cần nêu rõ bất cứ DBase nào nó cần. User có đủ quyền thì truy cập được.

Với hai thể trạng thì phải chính chúng có linked (xem bài #9). Nếu không có link sẵn thì phải:
1. chạy một sp để tạo link (sp_addkinkedserver), hoặc
2. dùng hàm Openrowset để lấy dữ liệu của thể trạng thứ hai, hoặc
3. dùng hàm OpenDatasource
Và như tôi đã nói ở bài #12, tất cả 3 điều trên đều tuỳ thuộc vào sự cho phép của admin cái server thứ hai.

Như hình thì chủ thớt đã lấy được dữ liệu từ Database thứ nhất (DB1) nhưng cần lấy thêm dữ liệu từ DB2. Theo như cách làm thông thường (tách CSDL khi quá lớn) thì 2 database này nằm cùng 1 SQL Server – 1 instance như bác @Vietmini đã nói ở trên.
Do đó cứ theo như bài #9 và sửa lại cho câu lệnh dùng cho cùng SQL Server, ADO chạy tốt đối với câu lệnh này.
Chuỗi kết nối cũng có thể làm 2 cách:
1. Không khai báo INITIAL CATALOG: khi đó phải thêm tên cả 2 Database vô câu lệnh SQL
Vd:

SELECT * FROM [Database1].[dbo].[Table1]
UNION ALL
SELECT * FROM [Database2].[dbo].[Table2]

2. Khai báo INITIAL CATALOG = Database1

SELECT * FROM [Table1]
UNION ALL
SELECT * FROM [Database2].[dbo].[Table2]

Cuối dùng là cả 2 database phải được Admin phân quyền như nhau cho cùng 1 Account kết nối.

Mượn code của bạn @Hau151978:

Sub test()
    Dim cnn As ADODB.Connection, rs As ADODB.Recordset
    Dim ConnectionString As String, SQLString As String
    Set cnn = New ADODB.Connection
    ConnectionString = "Network Library=DBMSSOCN;" & _
                                   "PROVIDER=SQLOLEDB;DATA SOURCE=" & TargetServer & _
                                   ";INITIAL CATALOG=''" & _
                                   ";User Id=" & UserID & ";Password=" & Password & ";"
    cnn.Open ConnectionString
    Set rs = New ADODB.Recordset
    SQLString = "SELECT * FROM [Database1].[dbo].[Table1] " & _
                         "UNION ALL " & _
                         "SELECT * FROM [Database2].[dbo].[Table2]"
    rs.Open SQLString, cnn
    Sheet1.Range("A2").CopyFromRecordset rs
    rs.Close
    Set rs = Nothing
    cnn.Close
    Set cnn = Nothing
End Sub

www.giaiphapexcel.com/diendan/threads/nh%E1%BB%9D-h%C6%B0%E1%BB%9Bng-d%E1%BA%ABn-k%E1%BA%BFt-n%E1%BB%91i-excel-b%E1%BA%B1ng-code-vba-v%E1%BB%9Bi-2-csdl-trong-sql.153723/

Khóa học Power PI – Ứng dung trong Nhân sự
Khóa học SprinGO phù hợp

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
★★★★★ 5 ★ 1 👤 0 ▥ 0
Quảng cáo

Bạn nên đọc

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm