# 2200T — invalid_xml_processing_instruction

> PostgreSQL SQLSTATE 2200T 的来源与诊断参考。
---

# 2200T

## 速览 {#at-a-glance}
XML 处理指令违反 XML 语法。PostgreSQL 18.6 的 `xmlpi` 路径拒绝大小写不敏感地等于 `xml` 的目标名，或含有 `?>` 的非 NULL 内容；两条 guard 都报告 `invalid XML processing instruction`，并附加对应 DETAIL。

<!-- BEGIN SQLSTATE FACTS: generated by scripts/generate.py; do not edit -->

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `2200T` |
| 条件名 | `invalid_xml_processing_instruction` |
| 状态 | `有效` |
| 已知存在于 | `8.3.0` |
| 锁定快照 | `9.0.23, 9.1.24, 9.2.24, 9.3.25, 9.4.26, 9.5.25, 9.6.24, 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3` |
| 宏 | `ERRCODE_INVALID_XML_PROCESSING_INSTRUCTION` |
| 别名 | `—` |

<!-- source facts: data/errcodes/2200T.json -->
<!-- END SQLSTATE FACTS -->

## 含义 {#meaning}
本成员专用于 XML 处理指令语法，包括目标名和内容。`xmlpi` 用大小写不敏感比较检查目标名，因此 `xml`、`XML` 和混合大小写都会命中同一目标 guard。完成该语法检查后才应用 SQL NULL 规则：合法目标配 NULL 内容时返回 NULL；非 NULL 内容含有 `?>` 时命中内容 guard。

## 报文 {#messages}

目标 guard 以 `ERROR` 报告 primary：`invalid XML processing instruction`，DETAIL 为 `XML processing instruction target name cannot be "%s".`。内容 guard 使用相同 primary，DETAIL 为 `XML processing instruction cannot contain "?>".`。引用分支没有独立 HINT。`%s` 是运行时目标名；合法目标下的 NULL 内容不是 2200T 错误。

## 诊断 {#diagnosis}
结合完整 message 和 detail 判断是目标名还是指令内容有问题。检查目标名规则，并在保持周围 XML 结构有效的前提下从内容中移除结尾 `?>` 序列。不要用本成员规则去修复注释或一般文档错误。

## 处理 {#response}
按 detail 指出的目标名或指令内容修正处理指令，保持 XML 结构有效并移除被禁止的处理指令形式。

该分支抛出 `ERROR` 时，显式事务应先用 `ROLLBACK` 恢复，或对语句前已建立的保存点执行 `ROLLBACK TO SAVEPOINT`，再重试；自动提交下只在失败语句结束后重试修正后的动作。事务边界规则见[事务与重试指南](../guides/)。

## 版本 {#versions}
锁定目录从 8.3.0 起记录该条件；固定源码覆盖 PostgreSQL 18.6。

## 相关 {#related}
[`2200L`](../2200l/)、[`2200S`](../2200s/)

## 来源 {#sources}
固定源码：[`src/backend/utils/adt/xml.c#L1010-1055`](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/adt/xml.c#L1010-L1055)。结构化[证据记录](../../data/evidence/2200t.json)保留两条 guard、message/detail 变体、NULL 顺序和范围边界。目标名和指令内容是运行时值；本页未运行自然 XML 案例。
