# 执行 SQL

执行一条 SQL，并返回本次执行的查询 ID。用该 ID 查询运行状态；查询成功后，状态响应会返回读取或下载结果所需的结果 ID（`statement_id`）。

```text
POST https://moi.matrixorigin.cn/newmoi/query/execute
```

## 调用前准备

准备有目标工作区访问权限的个人访问令牌和工作区 ID。执行 SQL 的身份还需要具有目标数据库的相应权限；不要将未经处理的用户输入直接拼接到 SQL 中。

下方示例使用：

- `$AI_STUDIO_API_KEY`：实际个人访问令牌，通过 `X-API-Key` Header 传递。
- `$WORKSPACE_ID`：要执行 SQL 的工作区 ID，通过 `X-Workspace-ID` Header 传递。

## 请求体

| 字段 | 类型 | 是否必填 | 说明 |
| --- | --- | --- | --- |
| `query` | string | 是 | 要执行的 SQL。 |
| `db_name` | string | 否 | 执行 SQL 时使用的数据库。 |
| `sql_type` | string | 否 | 调用方定义的 SQL 类型标识。 |
| `offset` | integer | 否 | 首个结果窗口的起始位置。 |
| `limit` | integer | 否 | 结果窗口的行数；未提供或小于等于 `0` 时，服务端使用 `1000`。 |

## 请求示例

```bash
curl -X POST "https://moi.matrixorigin.cn/newmoi/query/execute" \
  -H "X-API-Key: $AI_STUDIO_API_KEY" \
  -H "X-Workspace-ID: $WORKSPACE_ID" \
  -H 'Content-Type: application/json' \
  -d '{
    "db_name": "sales",
    "query": "SELECT 1 AS n",
    "offset": 0,
    "limit": 20
  }'
```

## 成功响应

响应仅返回查询 ID。使用该 ID [查询执行状态](get-execution-status.md)，获取状态和 Statement ID。

```json
{
  "code": 200,
  "data": {
    "id": "query_01",
    "query_id": "query_01"
  }
}
```

响应字段如下。

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | integer | 成功时为 `200`。 |
| `data.id` | string | 查询 ID，与 `data.query_id` 相同。 |
| `data.query_id` | string | 查询 ID；用于查询状态或取消执行。 |

## 错误响应

```json
{"code": 400, "message": "请求参数无效"}
```

### 常见 HTTP 错误

```{list-table}
:header-rows: 1
:widths: 15 45 40

* - HTTP 状态码
  - 常见原因
  - 建议操作
* - `400`
  - 请求体不是有效 JSON，或缺少 `query`。
  - 检查请求体和必填字段。
* - `401`
  - 凭据缺失或无效。
  - 检查访问令牌。
* - `403`
  - 当前身份没有执行目标 SQL 所需的权限。
  - 使用有权限的凭据，或联系管理员授权。
* - `404`
  - 指定的数据库或 SQL 引用的对象不存在。
  - 检查 `db_name` 和 SQL 中的对象名称。
* - `500`
  - SQL 执行、连接或服务端处理失败。
  - 记录错误信息后重试。
* - `503`
  - 当前角色的执行连接不可用。
  - 稍后重试。
```


## 后续操作

记录 `data.query_id`（与 `data.id` 相同）。先[查询执行状态](get-execution-status.md)；状态表示已成功后再[查询执行结果](get-execution-result.md)或[下载执行结果](download-execution-result.md)。需要中止时[取消执行](cancel-execution.md)。
