1. Tổng quan về hàm BS_SQL
Trong môi trường làm việc hiện đại, việc kết hợp dữ liệu từ các nguồn khác nhau đang trở thành một nhu cầu thiết yếu. Excel, với khả năng xử lý và trực quan hoá dữ liệu mạnh mẽ, đã được mở rộng bằng nhiều hàm và công cụ hỗ trợ người dùng truy xuất, biến đổi và phân tích dữ liệu một cách linh hoạt. Trong số các hàm này, hàm BS_SQL (tiếng Anh: BusinessSQL hoặc BackendSQL) là một trong những công cụ ít được biết đến nhưng lại mang lại tiềm năng vô cùng lớn cho các nhà phân tích dữ liệu và lập trình viên.
1.1. Định nghĩa hàm BS_SQL
Hàm BS_SQL là một hàm tùy chỉnh (custom function) được tích hợp thông qua Add‑in hoặc VBA (Visual Basic for Applications) nhằm cho phép người dùng thực thi các câu lệnh SQL trực tiếp từ trong Excel và trả về kết quả dưới dạng bảng, mảng hoặc giá trị đơn. Thay vì phải mở một phần mềm quản trị cơ sở dữ liệu (như SQL Server Management Studio, MySQL Workbench…), người dùng có thể viết câu lệnh SELECT, INSERT, UPDATE, DELETE ngay trong ô công thức và nhận kết quả ngay lập tức.
1.2. Lịch sử và nguồn gốc
- 2007‑2026: Các nhà phát triển VBA bắt đầu tạo ra các hàm “SQL trong Excel” bằng cách khai thác
ADODB.ConnectionvàADODB.Recordset. Những hàm này thường được đặt tên tự do, ví dụSQLQuery,RunSQL. - 2026: Microsoft giới thiệu Power Query (trước đây là “Data Explorer”) cho phép kéo dữ liệu từ nguồn SQL, nhưng không phải là một hàm công thức.
- 2026‑2026: Các nhà cung cấp add‑in như Kutools, ASAP Utilities, và Devart phát hành add‑in hỗ trợ hàm BS_SQL, giúp thực thi SQL nhanh hơn và không cần viết VBA.
- 2026‑hiện tại: Với sự ra đời của Office Scripts và JavaScript API cho Excel trên web, hàm BS_SQL đã được mở rộng để hỗ trợ cả môi trường desktop và online, đồng thời tích hợp với Microsoft Power Platform.
1.3. Lý do sử dụng hàm BS_SQL
- Tiết kiệm thời gian: Tránh việc phải xuất dữ liệu sang CSV, mở phần mềm quản trị, rồi nhập lại vào Excel.
- Tính linh hoạt: Thực hiện các phép tính phức tạp, join, group by ngay trong ô công thức.
- Tự động hoá: Khi dữ liệu nguồn thay đổi, công thức tự động cập nhật kết quả mới mà không cần thao tác thủ công.
- Khả năng mở rộng: Kết nối tới nhiều loại DBMS (SQL Server, MySQL, PostgreSQL, Oracle, SQLite…) chỉ cần thay đổi chuỗi kết nối.
2. Cài đặt và cấu hình môi trường
2.1. Yêu cầu hệ thống
| Thành phần | Yêu cầu tối thiểu |
|---|---|
| Hệ điều hành | Windows 7/8/10/11 (64‑bit) hoặc macOS 10.15+ (đối với phiên bản Office 365) |
| Phiên bản Excel | Excel 2026 trở lên, hoặc Excel cho Microsoft 365 |
| .NET Framework | 4.5 trở lên (đối với các add‑in viết bằng .NET) |
| Provider OLE DB / ODBC | Tùy thuộc vào DBMS (SQL Server Native Client, MySQL ODBC, etc.) |
| Quyền truy cập | Được phép kết nối tới server DB (có IP, port, tài khoản) |
2.2. Cài đặt Add‑in BS_SQL
- Mở Excel → Tab “Insert” → “Get Add‑ins” (hoặc “Store”).
- Tìm kiếm “BS_SQL” hoặc “SQL Query for Excel”.
- Chọn add‑in phù hợp (ví dụ: “BS_SQL Professional” của Devart) và nhấn Add.
- Sau khi cài đặt, một tab mới “BS_SQL” sẽ xuất hiện trong ribbon.
2.3. Cấu hình kết nối
Trong tab BS_SQL → Connection Manager:
| Trường | Mô tả | Ghi chú |
|---|---|---|
| Tên kết nối | Đặt tên nhận dạng, ví dụ “SQLServer_Prod” | Dùng cho công thức |
| Loại DBMS | SQL Server, MySQL, PostgreSQL, Oracle, SQLite, … | Chọn đúng loại |
| Server | Địa chỉ IP hoặc tên host | Nếu dùng cổng mặc định, không cần nhập |
| Port | Cổng kết nối (mặc định: 1433 cho SQL Server) | |
| Database | Tên cơ sở dữ liệu | |
| User ID | Tên người dùng | |
| Password | Mật khẩu | Có thể lưu dưới dạng “Encrypted” |
| Advanced Options | Thuộc tính như Trusted_Connection=Yes, Encrypt=True | Đối với môi trường bảo mật cao |
Nhấn Test Connection để xác nhận. Khi thành công, click Save.
3. Cú pháp và tham số của hàm BS_SQL
3.1. Cú pháp cơ bản
=BS_SQL(connection_name, sql_query, output_type, parameters)
- connection_name (bắt buộc): Tên kết nối đã khai báo trong Connection Manager.
- sql_query (bắt buộc): Chuỗi câu lệnh SQL. Có thể viết trực tiếp trong công thức hoặc tham chiếu tới một ô chứa câu lệnh.
- output_type (tùy chọn):
"TABLE"(mặc định) trả về mảng 2‑chiều,"SCALAR"trả về một giá trị duy nhất,"JSON"trả về chuỗi JSON. - parameters (tùy chọn): Mảng các giá trị dùng cho parameterized query (để tránh SQL Injection). Định dạng:
{param1, param2, …}hoặc chuỗi JSON.
3.2. Ví dụ minh hoạ
3.2.1. Truy vấn đơn giản
=BS_SQL("SQLServer_Prod", "SELECT TOP 10 FROM dbo.Sales ORDER BY SaleDate DESC")
Kết quả: 10 hàng mới nhất của bảng Sales sẽ xuất hiện bắt đầu từ ô chứa công thức, mở rộng thành mảng.
3.2.2. Truy vấn có tham số
Giả sử ô B2 chứa ngày bắt đầu, ô B3 chứa ngày kết thúc.
=BS_SQL("SQLServer_Prod", "SELECT ProductID, SUM(Quantity) AS TotalQty FROM dbo.Sales WHERE SaleDate BETWEEN ? AND ? GROUP BY ProductID", "TABLE", {B2,B3})
Dấu ? là placeholder cho các tham số. Add‑in sẽ tự động thay thế bằng giá trị trong mảng {B2,B3}.
3.2.3. Trả về scalar
=BS_SQL("MySQL_Dev", "SELECT COUNT() FROM customers", "SCALAR")
Kết quả là một số nguyên duy nhất hiển thị trong ô.
3.2.4. Trả về JSON
=BS_SQL("Postgres_Prod", "SELECT json_build_object('id', id, 'name', name, 'price', price) FROM products WHERE id = 10", "JSON")
Kết quả: {"id":10,"name":"Laptop X","price":1299.99}
3.3. Các tùy chọn nâng cao
| Tham số | Mô tả | Giá trị mặc định |
|---|---|---|
| Timeout | Thời gian chờ (giây) cho truy vấn | 30 |
| Cache | Lưu trữ kết quả trong bộ nhớ tạm để giảm tải | FALSE |
| RefreshMode | "ON_DEMAND" (khi nhấn F9) hoặc "AUTOMATIC" (khi dữ liệu nguồn thay đổi) | "ON_DEMAND" |
| ErrorHandling | "THROW" (báo lỗi) hoặc "IGNORE" (trả về #N/A) | "THROW" |
Bạn có thể đặt các tùy chọn này trong Connection Manager hoặc truyền qua hàm bằng cú pháp:
=BS_SQL("SQLServer_Prod", sql, "TABLE", , {"Timeout",60;"Cache",TRUE})
4. Các kỹ thuật tối ưu hoá truy vấn trong Excel
4.1. Sử dụng Parameterized Queries
- Lợi ích: Tránh SQL Injection, giảm overhead chuẩn bị câu lệnh.
- Cách thực hiện: Dùng dấu
?trong câu lệnh và truyền mảng tham số như trong ví dụ 3.2.2.
4.2. Giới hạn số dòng trả về
- TOP / LIMIT: Luôn áp dụng
TOP(SQL Server) hoặcLIMIT(MySQL, PostgreSQL) để không tải toàn bộ bảng lớn. - WHERE: Lọc dữ liệu càng sớm càng tốt, giảm băng thông và thời gian thực thi.
4.3. Indexing và Execution Plan
- Kiểm tra Execution Plan trên server để đảm bảo các cột được lọc (
WHERE,JOIN) có index. - Tránh
SELECTnếu chỉ cần một vài cột.
4.4. Cache nội bộ
Nếu dữ liệu không thay đổi thường xuyên, bật Cache trong Connection Manager. Khi dữ liệu thay đổi, nhấn Refresh trên tab BS_SQL để cập nhật.
4.5. Tránh “circular reference”
Khi công thức BS_SQL tham chiếu tới ô chứa kết quả của chính nó (ví dụ: dùng ô A1 để làm tham số cho công thức trong A1), Excel sẽ báo lỗi “Circular Reference”. Đảm bảo các tham số nằm ở ô khác.
5. So sánh hàm BS_SQL với các công cụ khác trong Excel
| Tiêu chí | BS_SQL | Power Query | VBA + ADODB | Microsoft Query |
|---|---|---|---|---|
| Cú pháp công thức | Có, trực tiếp trong ô | Không (dùng UI) | Không (đòi hỏi macro) | Không (dùng UI) |
| Thực thi động | Có (Refresh tự động) | Có (Refresh) | Có (Run macro) | Có (Refresh) |
| Hỗ trợ đa DBMS | Rất tốt (qua provider) | Tốt (SQL Server, MySQL, Oracle) | Tốt (phụ thuộc driver) | Giới hạn |
| Giao diện người dùng | Thân thiện, tab riêng | Giao diện M (Power Query Editor) | Phức tạp | Cũ, ít tính năng |
| Khả năng trả về JSON/Array | Có | Không trực tiếp (cần chuyển đổi) | Có (custom code) | Không |
| Bảo mật | Hỗ trợ encrypted connection, parameterization | Hỗ trợ credential store | Phụ thuộc macro | Hạn chế |
| Giá thành | Thường trả phí (add‑in) | Miễn phí (Office) | Miễn phí (VBA) | Miễn phí (Office) |
6. Ứng dụng thực tế
6.1. Báo cáo bán hàng hàng ngày
6.1.1. Mô tả bài toán
Công ty muốn có một bảng báo cáo trong Excel tự động cập nhật doanh thu ngày hôm qua, số đơn hàng, và top 5 sản phẩm. Dữ liệu lưu trong SQL Server SalesDB.
6.1.2. Giải pháp với BS_SQL
- Tạo kết nối: “SQLServer_Sales”.
- Công thức ngày hôm qua:
excel =TODAY()-1
Đặt vào ôB1. - Doanh thu:
excel =BS_SQL("SQLServer_Sales", "SELECT SUM(TotalAmount) FROM dbo.Sales WHERE CAST(SaleDate AS DATE)=?", "SCALAR", {B1}) - Số đơn hàng:
excel =BS_SQL("SQLServer_Sales", "SELECT COUNT() FROM dbo.Sales WHERE CAST(SaleDate AS DATE)=?", "SCALAR", {B1}) - Top 5 sản phẩm:
excel =BS_SQL("SQLServer_Sales", "SELECT TOP 5 ProductName, SUM(Quantity) AS Qty FROM dbo.Sales WHERE CAST(SaleDate AS DATE)=? GROUP BY ProductName ORDER BY Qty DESC", "TABLE", {B1}) - Định dạng: Áp dụng Conditional Formatting để tô màu các giá trị cao/ thấp.
Kết quả: Khi người dùng mở file vào buổi sáng, các công thức tự động lấy dữ liệu ngày hôm qua và cập nhật báo cáo.
6.2. Kiểm tra tồn kho thời gian thực
6.2.1. Nhu cầu
Kho hàng muốn theo dõi số lượng tồn của từng mặt hàng theo thời gian thực, đồng thời cảnh báo khi tồn dưới mức tối thiểu.

Có thể bạn quan tâm: Bài Test Excel C&b: Hướng Dẫn Toàn Diện Từ Cơ Bản Đến Nâng Cao
6.2.2. Cách thực hiện
- Kết nối: “MySQL_Warehouse”.
- Công thức tồn kho (đặt ở ô A2, kéo xuống):
excel =BS_SQL("MySQL_Warehouse", "SELECT StockQty FROM inventory WHERE SKU = ?", "SCALAR", {A2}) - Công thức cảnh báo (ô B2):
excel =IF(A2 < 10, "⚠️ Low Stock", "OK") - Refresh: Thiết lập
RefreshMode = "AUTOMATIC"để mỗi khi người dùng thay đổi SKU, hàm tự thực thi lại.
6.3. Đánh giá hiệu suất nhân viên
6.3.1. Yêu cầu
Quản lý muốn tính tổng thời gian làm việc và số dự án hoàn thành cho mỗi nhân viên trong tháng hiện tại, dữ liệu lưu trong PostgreSQL.
6.3.2. Quy trình
- Xác định tháng hiện tại:
excel =TEXT(TODAY(),"yyyy-MM")
Đặt vào ôC1. - Công thức tổng thời gian (ô D2):
excel =BS_SQL("Postgres_HR", "SELECT SUM(hours) FROM work_log WHERE employee_id = ? AND to_char(work_date,'YYYY-MM') = ?", "SCALAR", {B2, C1}) - Công thức số dự án (ô E2):
excel =BS_SQL("Postgres_HR", "SELECT COUNT(DISTINCT project_id) FROM project_assign WHERE employee_id = ? AND to_char(assign_date,'YYYY-MM') = ?", "SCALAR", {B2, C1}) - Pivot Table: Dùng kết quả để tạo Pivot Table tổng hợp toàn công ty.
Kết quả: Báo cáo được cập nhật mỗi ngày mà không cần thao tác thủ công.
7. Bảo mật và quản lý quyền truy cập
7.1. Mật khẩu và lưu trữ
- Encrypted Storage: Khi lưu mật khẩu trong Connection Manager, add‑in sử dụng thuật toán AES‑256 để mã hoá.
- Credential Manager: Trên Windows, có thể liên kết tới Windows Credential Manager để lấy thông tin đăng nhập mà không lưu trong file Excel.
7.2. Quyền người dùng
- Read‑Only vs Read‑Write: Trong chuỗi kết nối, có thể chỉ định
ApplicationIntent=ReadOnlyđể tránh thay đổi dữ liệu. - Row‑Level Security: Nếu DBMS hỗ trợ (SQL Server RLS), người dùng Excel sẽ chỉ nhận được dữ liệu mà tài khoản DB cho phép.
7.3. Ngăn chặn SQL Injection
- Luôn sử dụng parameterized queries thay vì chèn giá trị trực tiếp vào chuỗi.
- Kiểm tra và sanitize dữ liệu đầu vào nếu phải dùng
CONCATtrong câu lệnh.
7.4. Auditing
- Nhiều add‑in cung cấp log file ghi lại mỗi lần thực thi, bao gồm: thời gian, người dùng, câu lệnh, thời gian thực thi, và kết quả (thành công / lỗi). Điều này hữu ích cho việc audit và debug.
8. Xử lý lỗi và debug
8.1. Các lỗi thường gặp
| Mã lỗi | Mô tả | Nguyên nhân phổ biến | Giải pháp |
|---|---|---|---|
#BS_SQL! | Lỗi chung | Kết nối không tồn tại, query sai cú pháp | Kiểm tra tên kết nối và câu lệnh |
#VALUE! | Giá trị không hợp lệ | Tham số không khớp kiểu dữ liệu | Đảm bảo truyền đúng kiểu (text, number, date) |
#N/A | Không có dữ liệu | Query trả về rỗng và ErrorHandling=IGNORE | Kiểm tra dữ liệu nguồn |
#REF! | Tham chiếu lỗi | Vùng trả về vượt quá kích thước ô | Đảm bảo ô đủ rộng hoặc dùng TABLE để tự mở rộng |
#TIMEOUT! | Hết thời gian chờ | Query mất quá lâu, hoặc server chậm | Tăng Timeout hoặc tối ưu query |
8.2. Công cụ Debug
- Query Analyzer: Nhiều add‑in có nút “View SQL” để hiển thị câu lệnh thực tế đã được thay thế tham số.
- Log Viewer: Mở file
BS_SQL.log(thường nằm trong%APPDATA%\BS_SQL\logs) để xem chi tiết. - Immediate Window (VBA): Khi dùng VBA để gọi hàm, có thể dùng
Debug.Printđể in ra chuỗi kết nối và câu lệnh.
8.3. Thực hành tốt
- Kiểm tra query trong SSMS (hoặc công cụ DBMS) trước khi đưa vào Excel.
- Sử dụng TRY…CATCH trong SQL để trả về thông báo lỗi tùy chỉnh.
- Giới hạn quyền: Không dùng tài khoản
sahoặcroottrong môi trường production.
9. Tích hợp với các công cụ Power Platform
9.1. Power Automate
Bạn có thể tạo flow tự động:
- Trigger: Khi file Excel được lưu hoặc thay đổi.
- Action: Sử dụng “Run a Script” (Office Scripts) để gọi hàm
BS_SQLvà ghi kết quả vào một bảng khác. - Output: Gửi email báo cáo hoặc cập nhật Power BI dataset.
9.2. Power BI
- DirectQuery: Thay vì sử dụng hàm BS_SQL, bạn có thể kết nối trực tiếp Power BI tới DBMS, nhưng nếu muốn giữ dữ liệu trong Excel thì có thể dùng “Publish to Power BI” từ Excel, bao gồm các bảng được tạo bởi BS_SQL.
9.3. Power Apps
- Khi tạo Canvas App dựa trên file Excel, các công thức BS_SQL sẽ không thực thi trên server Power Apps. Thay vào đó, bạn nên chuyển logic SQL sang Azure SQL hoặc Dataverse, và dùng Connector.
10. Các ví dụ nâng cao
10.1. Sử dụng CTE (Common Table Expression)
=BS_SQL("SQLServer_Prod", "WITH MonthlySales AS ( SELECT ProductID, SUM(Quantity) AS Qty, MONTH(SaleDate) AS Mth FROM dbo.Sales WHERE YEAR(SaleDate) = ? GROUP BY ProductID, MONTH(SaleDate) ) SELECT ProductID, Mth, Qty FROM MonthlySales WHERE Mth = ?", "TABLE", {2026, 7})
10.2. Truy vấn JSON và chuyển thành bảng
=BS_SQL("Postgres_Prod", "SELECT json_agg(row_to_json(t)) FROM ( SELECT id, name, price FROM products WHERE price > 100 ) t", "JSON")
Sau khi nhận được chuỗi JSON, dùng hàm FILTERXML (hoặc Power Query) để chuyển thành bảng.
10.3. Thực thi lệnh DML (INSERT/UPDATE) từ Excel
=BS_SQL("MySQL_Dev", "INSERT INTO audit_log (user_name, action, log_time) VALUES (?, ?, NOW())", "SCALAR", {USER(), "Export Data"})
Kết quả trả về là số dòng bị ảnh hưởng (thông thường = 1). Lưu ý: Đặt ErrorHandling="IGNORE" nếu không muốn báo lỗi khi có ràng buộc.
11. Lưu trữ và chia sẻ file Excel có hàm BS_SQL
11.1. Khi chia sẻ trong nội bộ
- Đảm bảo cùng một Connection Manager được cấu hình trên máy của người nhận.
- Có thể xuất template file (.xltx) kèm theo hướng dẫn cài đặt add‑in.
11.2. Khi chia sẻ bên ngoài
- Không lưu mật khẩu trong file. Hướng dẫn người nhận tạo connection mới và nhập thông tin đăng nhập.
- Sử dụng Excel Online: Một số add‑in không hỗ trợ trên web, vì vậy cần chuyển công thức sang Power Query hoặc VBA trước khi chia sẻ.
11.3. Version Control
- Khi lưu trong SharePoint hoặc OneDrive, Excel sẽ tạo phiên bản mới mỗi khi file được lưu. Đảm bảo không có xung đột trong Connection Manager (đồng thời nhiều người chỉnh sửa cùng lúc).
12. Các nguồn học và cộng đồng
| Nguồn | Loại nội dung | Link |
|---|---|---|
| Devart Documentation | Hướng dẫn chi tiết, ví dụ | https://www.devart.com/bs_sql/doc/ |
| Microsoft Docs – Power Query | So sánh và tích hợp | https://learn.microsoft.com/powerquery |
| Stack Overflow | Câu hỏi thực tế | https://stackoverflow.com/questions/tagged/bs_sql |
| Excel Campus (Jon Acampora) | Video tutorial về VBA + ADODB | https://excelcampus.com |
| Reddit – r/excel | Thảo luận cộng đồng | https://reddit.com/r/excel |
| LinkedIn Learning | Khóa học “Advanced Excel Data Connections” | https://linkedin.com/learning |
13. Kết luận
Hàm BS_SQL mở ra một kỷ nguyên mới cho việc tích hợp dữ liệu giữa Excel và các hệ quản trị cơ sở dữ liệu. Thay vì phải di chuyển dữ liệu qua lại giữa các công cụ, người dùng có thể viết một câu lệnh SQL duy nhất, đặt trong ô công thức và nhận kết quả ngay lập tức. Điều này không chỉ tăng năng suất mà còn giảm thiểu lỗi nhập liệu và cho phép tự động hoá quy trình báo cáo.
Tuy nhiên, để khai thác tối đa tiềm năng của BS_SQL, người dùng cần:
- Hiểu rõ cấu trúc dữ liệu và tối ưu hoá câu lệnh SQL.
- Áp dụng parameterized queries để bảo mật.
- Quản lý kết nối một cách có hệ thống (Connection Manager) và sử dụng encrypted storage cho mật khẩu.
- Kiểm soát thời gian thực thi và sử dụng cache khi dữ liệu không thay đổi thường xuyên.
- Kết hợp với Power Platform để mở rộng khả năng tự động hoá và chia sẻ báo cáo.
Với những kiến thức và kỹ thuật đã được trình bày trong bài viết này, bạn hoàn toàn có thể bắt đầu triển khai hàm BS_SQL trong các dự án thực tế, từ báo cáo bán hàng nhanh chóng, quản lý tồn kho thời gian thực, đến các phân tích nhân sự phức tạp. Hãy thử nghiệm, tối ưu hoá và chia sẻ kinh nghiệm của mình với cộng đồng – vì Excel không chỉ là một bảng tính, mà còn là một công cụ kết nối dữ liệu mạnh mẽ, và BS_SQL chính là chìa khóa mở ra cánh cửa đó.

Tiến sĩ Lê Thống Nhất sinh năm 1955 tại Nghệ An, là nhà giáo, nhà báo và doanh nhân trong lĩnh vực giáo dục. Ông từng giảng dạy Toán học tại Trường THPT Chuyên Phan Bội Châu và đảm nhiệm nhiều vai trò trong ngành giáo dục, từ viết sách, biên soạn tài liệu đến sáng lập các dự án hỗ trợ học tập trực tuyến.
Ông là người sáng lập BigSchool – nền tảng giáo dục trực tuyến kết nối giáo viên và học sinh cả nước. Ngoài ra, ông còn nổi tiếng với vai trò tác giả, diễn giả truyền cảm hứng và khách mời trên nhiều chương trình truyền hình, trong đó có “Ai là triệu phú” trên truyền hình VTV.
Trong suốt sự nghiệp, Tiến sĩ Lê Thống Nhất đã nhận nhiều giải thưởng giáo dục và được biết đến như một người luôn đổi mới, ứng dụng công nghệ vào dạy và học, góp phần lan tỏa tri thức và niềm say mê học tập cho thế hệ trẻ.
