---
title: Odbc.Query – ดำเนินการค้นหาข้อมูลผ่าน ODBC
url: https://www.thepexcel.com/functions/power-query/accessing-data-functions/odbc-query/
type: function-explainer
program: Power Query
syntax: "Odbc.Query(connectionString as any, query as text, optional options as nullable record) as table"
date: 2025-12-12
updated: 2025-12-25
scores:
  popularity: 5
  difficulty: 5
  usefulness: 5
---

# Odbc.Query – ดำเนินการค้นหาข้อมูลผ่าน ODBC

> Odbc.Query ใช้สำหรับดำเนินการคำสั่ง SQL โดยตรงต่อฐานข้อมูล ODBC ใดๆ เช่น SQL Server, MySQL, PostgreS

## คำอธิบาย

Odbc.Query ใช้สำหรับดำเนินการคำสั่ง SQL โดยตรงต่อฐานข้อมูล ODBC ใดๆ เช่น SQL Server, MySQL, PostgreSQL, Oracle และส่งคืนผลลัพธ์เป็นตาราง

## Syntax

```excel
Odbc.Query(connectionString as any, query as text, optional options as nullable record) as table
```

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| connectionString | Yes | text or record |  | สตริงการเชื่อมต่อ ODBC หรือระเบียน property-value pairs สำหรับเชื่อมต่อฐานข้อมูล |
| query | Yes | text |  | คำสั่ง SQL ที่ต้องการดำเนินการบนฐานข้อมูล (เช่น SELECT, UPDATE, DELETE) |
| options | No | record | null | ตัวเลือกเพิ่มเติมเพื่อกำหนดค่าพฤติกรรมการเชื่อมต่อ (ConnectionTimeout, CommandTimeout เป็นต้น) |

## ตัวอย่าง

### 1. ตัวอย่างพื้นฐาน - ดึงข้อมูลจากตารางโดยใช้ DSN

```excel
let
    ConnectionString = "dsn=MyDatabase",
    Query = "SELECT * FROM Customers",
    Result = Odbc.Query(ConnectionString, Query)
in
    Result
```

**ผลลัพธ์:** `ตารางแสดงข้อมูลลูกค้าทั้งหมดจากตาราง Customers`

ใช้ DSN (Data Source Name) ที่กำหนดไว้แล้วในระบบเพื่อเชื่อมต่อฐานข้อมูล แล้ว SELECT ข้อมูลทั้งหมดจากตาราง Customers

### 2. ตัวอย่าง - กำหนด Connection String โดยตรง

```excel
let
    ConnectionString = "Driver={ODBC Driver 17 for SQL Server};Server=localhost;Database=SalesDB;Uid=admin;Pwd=password123",
    Query = "SELECT ProductID, ProductName, Price FROM Products WHERE Price > 1000",
    Result = Odbc.Query(ConnectionString, Query)
in
    Result
```

**ผลลัพธ์:** `ตารางแสดงสินค้าที่มีราคามากกว่า 1000 หน่วยสกุลเงิน`

กำหนด connection string อย่างสมบูรณ์พร้อม driver, server, database, username, password แล้วทำการค้นหาสินค้าที่มีราคามากกว่า 1000

### 3. ตัวอย่าง - ใช้ Connection Timeout และ Command Timeout

```excel
let
    ConnectionString = "dsn=MyDatabase",
    Query = "SELECT * FROM LargeTable",
    Options = [
        ConnectionTimeout = #duration(0, 0, 0, 30),
        CommandTimeout = #duration(0, 0, 5, 0)
    ],
    Result = Odbc.Query(ConnectionString, Query, Options)
in
    Result
```

**ผลลัพธ์:** `ตารางข้อมูลจาก LargeTable โดยมี timeout ที่กำหนดไว้`

ตั้งเวลารอการเชื่อมต่อ 30 วินาที และเวลารอการดำเนินการ SQL 5 นาที เพื่อหลีกเลี่ยงการค้างอย่างไม่สิ้นสุด

### 4. ตัวอย่าง - ใช้กับ JOIN หลายตาราง

```excel
let
    ConnectionString = "dsn=CompanyDB",
    Query = "SELECT o.OrderID, o.OrderDate, c.CustomerName, p.ProductName 
             FROM Orders o 
             INNER JOIN Customers c ON o.CustomerID = c.CustomerID 
             INNER JOIN Products p ON o.ProductID = p.ProductID 
             WHERE o.OrderDate >= '2024-01-01'",
    Result = Odbc.Query(ConnectionString, Query)
in
    Result
```

**ผลลัพธ์:** `ตารางแสดง OrderID, OrderDate, CustomerName, ProductName สำหรับออเดอร์ตั้งแต่ 2024-01-01 เป็นต้นไป`

ใช้ JOIN เพื่อรวมข้อมูลจากหลายตารางในฐานข้อมูล และกรองข้อมูลตามวันที่ที่ระบุ

### 5. ตัวอย่าง - ใช้กับการแยกข้อมูลโดย GROUP BY

```excel
let
    ConnectionString = "dsn=SalesDB",
    Query = "SELECT CategoryID, SUM(Amount) AS TotalSales, COUNT(*) AS TransactionCount 
             FROM Sales 
             GROUP BY CategoryID 
             ORDER BY TotalSales DESC",
    Result = Odbc.Query(ConnectionString, Query)
in
    Result
```

**ผลลัพธ์:** `ตารางแสดง CategoryID, TotalSales, TransactionCount โดยจัดเรียงจากยอดขายสูงสุดไปต่ำสุด`

ใช้ GROUP BY เพื่อรวมข้อมูลขายตามประเภท และคำนวณยอดขายรวมและจำนวนธุรกรรม

## หมายเหตุเพิ่มเติม

- ส่วนตัวผมแนะนำ DSN (Data Source Name) มากกว่า full connection string ครับ ทำไม? เพราะจัดการง่าย ปลอดภัยกว่า และไม่ต้องมั่ว password ไปนั่น

- ทดสอบ query ใน SQL management tool ก่อน 100% ครับ จะได้รู้ว่า query ตัวเองถูกต้องหรือผิด ถ้าไปใช้ใน Odbc.Query แล้วค่อยหาเจอ เสียเวลา

- ถ้า query ต้องรับค่าจากข้อมูลภายนอก ใช้ parameterized query เพื่อหลีกเลี่ยง SQL injection ครับ อันนี้สำคัญ 🔥

- ตั้ง timeout ให้พอดีตามความซับซ้อนของ query ปกติ 10 นาทีก็ดีแล้ว แต่ถ้า query มันเหลือเกินอยากรันไป 30 นาทีก็เป็นไร

- ไม่รู้ชื่อตารางกับ column ในฐานข้อมูล? ลอง Odbc.DataSource ก่อน มันจะบอกว่าในฐานข้อมูลมีอะไรอยู่บ้าง จึงไปเขียน query ได้แม่นกว่า

- ข้อมูลขนาดใหญ่ก็อย่าพึ่งดึงทั้งหมด ลองใช้ TOP หรือ LIMIT ในคำสั่ง SQL เพื่อดึงแค่ไม่กี่แถวทดสอบก่อน โหลดได้เร็วมากครับ

- อย่าลืมตรวจสอบ permission ของ user account นะครับ ถ้า account นั้นไม่มีสิทธิอ่านตารางนี้ Odbc.Query ก็จะขึ้น error เลย 😭

## คำถามที่พบบ่อย

**Q: Odbc.Query ใช้ได้กับฐานข้อมูลประเภทไหนบ้าง?**

เกือบทุกฐานข้อมูลเลยครับ ตราบใจ ODBC driver เค้ารองรับ SQL Server, MySQL, PostgreSQL, Oracle, Microsoft Access, SQLite ฯลฯ ถ้าฐานข้อมูลไหนมี ODBC driver ก็ใช้ได้เหมือนกัน

**Q: ความแตกต่างระหว่าง Odbc.Query กับ Odbc.DataSource คืออะไร?**

Odbc.DataSource มันโชว์รายชื่อตารางและ views ที่อยู่ในฐานข้อมูลให้คุณเลือก แล้ว Odbc.Query ต่างหากครับ มันเอา SQL command ที่คุณเขียนไปรันตรงๆ แล้วส่งผลลัพธ์กลับมา ดังนั้นถ้าต้องคิด query ที่ซับซ้อน ใช้ Odbc.Query นะครับ

**Q: ต้องติดตั้ง ODBC driver หรือไม่?**

ต้องแน่นอนครับ ถ้าเครื่องของคุณไม่มี ODBC driver สำหรับฐานข้อมูลที่ต้องการ Odbc.Query มันจะไม่หาเจออยู่แล้ว หาอันที่เหมาะสมติดตั้งเสียก่อน

**Q: Connection timeout และ Command timeout ต่างกันอย่างไร?**

Connection timeout คือ 'นานเท่าไหร่ถึงจะยอมท้อว่าเชื่อมต่อไม่ได้' ส่วน Command timeout คือ 'นานเท่าไหร่ถึงจะยอมเพิ่มเติมว่า query นั่นค้างไป' เท่านั้นแหละ อันแรกเรื่องการเชื่อมต่อ อันหลังเรื่องการรันคำสั่ง

**Q: สามารถใช้ Odbc.Query สำหรับคำสั่ง INSERT, UPDATE, DELETE ได้หรือไม่?**

ได้นะครับ แต่จริงๆ ก็ไม่ค่อยเห็นใครใช้เพื่อแก้ไขข้อมูล มักจะใช้สำหรับดึงข้อมูล (SELECT) มากกว่า เพราะถ้าใช้ INSERT/UPDATE/DELETE ต้องมี permission พอ และต้องระวังไว้ด้วย ไม่อย่างนั้นขึ้นตัวที่ผิดไปเต็มฐานข้อมูล 😅

## แหล่งข้อมูลเพิ่มเติม

- [Microsoft Learn: Odbc.Query](https://learn.microsoft.com/en-us/powerquery-m/odbc-query) _(official)_
- [Microsoft Learn: Odbc.DataSource](https://learn.microsoft.com/en-us/powerquery-m/odbc-datasource) _(official)_
- [ODBC Official Documentation](https://learn.microsoft.com/en-us/sql/odbc/odbc-basics) _(official)_
- [Power Query M Language Reference](https://learn.microsoft.com/en-us/powerquery-m/) _(official)_

---

_Source: [https://www.thepexcel.com/functions/power-query/accessing-data-functions/odbc-query/](https://www.thepexcel.com/functions/power-query/accessing-data-functions/odbc-query/)_
