"""只读工具:导出 QuickTeam 存储过程源码。 网关 `ExecTable` 可以直接执行 `sys.sp_helptext`,因此无需数据库账号即可读到 SP 定义 —— 排查参数语义、确认字段来源时比猜快得多。 用法: python tools/sp_source.py usp_VerifyWorkSheetById python tools/sp_source.py usp_InsertWorkSheet usp_UpdateWorkSheetById --out docs/sp """ from __future__ import annotations import argparse import os import sys sys.path.insert(0, ".") from qtimport.config import Config # noqa: E402 from qtimport.transport import Transport # noqa: E402 def fetch(transport: Transport, name: str) -> str: rows = transport.exec_table("QuickTeam", "sys.sp_helptext", [("objname", name, "string")], op="helptext") if not isinstance(rows, list) or not rows: return "" return "".join(str(row.get("Text", "")) for row in rows) def main() -> int: parser = argparse.ArgumentParser() parser.add_argument("names", nargs="+") parser.add_argument("--config", default="config/config.json") parser.add_argument("--out", default="") args = parser.parse_args() cfg = Config.load(args.config) transport = Transport(cfg.base_url, timeout=60, retries=1) if args.out: os.makedirs(args.out, exist_ok=True) for name in args.names: full = name if name.startswith("QuickTeam.") else f"QuickTeam.{name}" text = fetch(transport, full) if not text.strip(): print(f"[空] {full}(不存在或无权读取)") continue print(f"===== {full} =====") print(text) if args.out: path = os.path.join(args.out, f"{name.split('.')[-1]}.sql") with open(path, "w", encoding="utf-8") as handle: handle.write(text) print(f"→ 已保存 {path}") return 0 if __name__ == "__main__": raise SystemExit(main())