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

Liên hệ QC

tonyro

Thành viên mới
Tham gia
2/4/09
Bài viết
3
Được thích
0
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 ạ. ae nào biết chỉ giúp e với. Tks
 

File đính kèm

  • vba.png
    vba.png
    20.1 KB · Đọc: 68
Chỉ giáo thì rất dễ.
Nhưng cây giáo thì nó chỉ biết đâm thoi chứ loại giáo kết nối thì chưa hề thấy.
 
Thế là chỉ kết nối được 1 CSDL thôi ah bác
 
Thế là chỉ kết nối được 1 CSDL thôi ah bác
Ý bác ấy là dùng từ "hỗ trợ" hoặc "giúp" chứ đừng dùng từ "chỉ giáo", ngoài ra đừng viết tắt, đừng xài tiếng nước ngoài, như e, ah, tks, không lịch sự.
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 ạ
 

File đính kèm

  • 16096467484714901829108812924517.jpg
    16096467484714901829108812924517.jpg
    104.2 KB · Đọc: 47
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 ạ
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.
 
Sao bạn không chụp hình cái bảng ếch sào của bạn để mọi người dễ hình dung và sẽ có giải pháp phù hợp với câu hỏi của bạn
 
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 ạ. ae nào biết chỉ giúp e với. Tks
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
1609674183391.png
 
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
...
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.
 
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ử.
Mã:
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
 
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.
 
...
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.
 
Tôi đang nghi ngờ câu SQL trong hình bài 1 đó không chạy được.

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:
Mã:
SELECT * FROM [Database1].[dbo].[Table1]
UNION ALL
SELECT * FROM [Database2].[dbo].[Table2]
2. Khai báo INITIAL CATALOG = Database1
Mã:
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:

Mã:
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
 
Lần chỉnh sửa cuối:
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ử.
Mã:
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
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:
 
Web KT
Back
Top Bottom