SQLServer批量删改存储过程脚本,交给走TaoToken的Codex审完再执行
SSMS 里批量删改存储过程的脚本先别急着跑。到 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 拿 Key再交给走 TaoToken 的 Codex 审它会检查 sysobjects 游标里 Foods_%、Users_% 的边界和 SP_RENAME 拼接全程不连库Key 通、用量记上账后再回 SSMS 执行。原文那种直接复制进查询窗口的跑法缺少事前检查先在 Codex 里过一遍等于给数据库操作加了一道只读复核。这篇文章就把这条流程走完整怎么拿 Key、怎么配 Codex、怎么让 Codex 审脚本以及审完后的脚本长什么样。1. 这段脚本为什么不能直接跑sysobjects 游标与 sp_rename 的边界1.1 sysobjects 遍历出来的不一定是存储过程原文脚本第一段用的是declare proccur cursor for select [name] from sysobjects where name like Foods_%这是 SQL Server 2005 之前遗留下来的常用写法。sysobjects里存放的是当前数据库所有对象表、视图、约束、触发器、存储过程都在里面name like Foods_%只按名字过滤没有xtype P或type P这类对象类型条件。只要库里存在一张叫Foods_Order的表或者一个Foods_GetUser的视图游标就会把这些对象一并抓进来。如果游标抓到表名删除段执行exec(drop proc procname)时SQL Server 会直接报「Foods_Order 不是过程」如果那个名字恰好属于触发器同样报错。这个现象和购物清单写「包装上带 Foods 的都要」一样最后买回来一堆不在计划里的东西。批量脚本最怕的就是这种静默扩大范围你以为只处理存储过程实际处理的是整个库里名字匹配的所有对象线上环境里一条误删就可能把同名表带到 DROP 语句面前。1.2 sp_rename 拼接的 temp 可能重名也可能越改越乱修改段用了两次游标。第一次把Foods_%改成kcb_前缀第二次想处理kcb%开头的名字。问题集中在第二段的长度计算set temp3 LEN(procname)再用RIGHT(procname, temp3 - 3)取子串最后拼回kcb_。一个叫kcb_Foods_GetUser的过程总长度 17减 3 后从右边取 14 个字符取到的是_Foods_GetUser再拼上kcb_就变成kcb__Foods_GetUser多了一个下划线名字并没有还原成预期目标。如果库里恰好存在kcb__Foods_GetUserSP_RENAME会报「已存在名为...的对象」。即使没有重名第二次游标的where name like kcb%又会把第一次改名后产生的kcb_Foods_GetUser全部再扫一遍。所以这段逻辑在边界上至少有三类问题对象类型没过滤、LEN 减的数字不对、两个游标的匹配范围相互覆盖。直接贴进 SSMS 跑结果往往不是改名而是把名字改得比原来更乱。2. 先把 TaoToken 的 Key 配到 Codexconfig.toml 指向 API 通道2.1 去 TaoToken 拿 Key而不是先翻数据库给 Codex 配 AI 服务是独立于 SQL Server 的一步。先打开 TaoToken 注册进控制台创建一把 API Key。Key 创建后通常只在页面里显示一次复制下来妥善保存模型 ID 不要猜以模型广场当时列出的列表为准。这里拿到的 Key 是给 Codex 调用 API 用的不是 SQL Server 连接字符串的一部分别混填。这一步对应原文里「复制代码到 SQL Server Management Studio 运行」之前的准备动作。以前只需要开 SSMS 就能跑现在还要先给 Codex 找一个能访问大模型的兼容通道。TaoToken 在这里承担的是统一 API 接入把 Codex 的请求转发到对应模型再返回完整的对话结果和用量记录它不碰数据库更不会执行任何存储过程。先花两分钟把 Key 拿到手后面的走查才能进行。2.2 ~/.codex/config.toml 增加 TaoToken 供应商Codex 通过~/.codex/config.toml指定模型供应商。先设置环境变量把 Key 放进去export CODEX_API_KEYYOUR_API_KEY然后编辑~/.codex/config.toml加入以下内容model YOUR_MODEL_ID model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key CODEX_API_KEY wire_api chat_completionsbase_url填https://taotoken.net/api末尾不要带/v1也不要追加任何?utm_source...参数。YOUR_API_KEY是从 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 创建的那把 KeyYOUR_MODEL_ID换成模型广场上列出的模型 ID以当时列表为准。保存后Codex 就会通过这个 Base URL 发起模型请求而不是走它默认的官方地址。3. 让 Codex 走查 Foods_ 与 Users_ 前缀脚本顺便验证用量3.1 给 Codex 的审查指令配置完成后先不急着打开 SSMS。把原文那段脚本的逻辑原样交给 Codex明确要求它只做静态审查不连接任何数据库。在终端执行codex进入交互会话粘贴下面的审查要求再把脚本内容跟在后面请作为 SQL Server DBA 审查一段存储过程批量重命名/删除脚本。 脚本核心逻辑是先用 sysobjects 游标找出 name like Foods_% 的对象 把每个对象 sp_rename 成 kcb_ 原名再找 name like kcb% 的对象 用 LEN 和 RIGHT 去掉前几个字符后重新拼接最后删掉 name like Users_% 的对象。 请检查四点 1) 游标里 WHERE name like 是否会把表、视图、触发器也选进来 2) 第二次重命名的 LEN 和 RIGHT 偏移量是否正确 3) SP_RENAME 拼接出的 temp 是否可能与现有对象重名 4) 删除段遇到同名非存储过程对象时会怎样。 只输出分析和修改建议不要执行任何数据库操作。Codex 会基于这段文本做静态走查它看不到你的库也不会去连 SQL Server。这样正好满足「先审再执行」的前提代码审查阶段不碰生产库等 Codex 把问题列出来再由你在 SSMS 里判断库里是否真的存在同名对象。整个过程里Codex 只接触文字和逻辑。3.2 这次调用本身就是一次用量验证Codex 走查完终端会显示这次请求消耗的 token 数量和模型返回情况。返回正常说明YOUR_API_KEY有效、Base URL 配置正确、模型 ID 能对上、API 通道整体是通的。回到 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 控制台能看到这笔调用记录和 Token 余额变化。这一步才是真正的「验证用量」不需要真的对数据库执行 DELETE光是一次成功的 Codex 审查请求已经证明 Key 和通道可用。如果控制台显示这次调用没有记录多半是环境变量没生效或者在codex启动前没执行export CODEX_API_KEYYOUR_API_KEY。回到第 2 节重新设置环境变量再跑一次审查命令即可。审查通过后接下来才轮到第 4 节里那两段真正可以落地的 SQL 脚本。4. 走查之后拿 SQL Server 里可落地的那版脚本4.1 批量修改按类型过滤避免第二次游标误伤Codex 走查报告会指向几个关键改动查询对象换成sys.procedures、名字匹配排除其余对象类型、SP_RENAME 前检查目标是否存在。「给 Foods_ 前缀加 kcb_」这一段可以写成DECLARE ProcName sysname; DECLARE proc_cursor CURSOR LOCAL FAST_FORWARD FOR SELECT p.name FROM sys.procedures AS p WHERE p.name LIKE Foods_%; OPEN proc_cursor; FETCH NEXT FROM proc_cursor INTO ProcName; WHILE FETCH_STATUS 0 BEGIN DECLARE NewName sysname kcb_ ProcName; IF OBJECT_ID(dbo. NewName, P) IS NULL BEGIN EXEC sys.sp_rename dbo. ProcName, NewName, OBJECT; PRINT 重命名: ProcName - NewName; END ELSE BEGIN PRINT 跳过,目标已存在: NewName; END FETCH NEXT FROM proc_cursor INTO ProcName; END; CLOSE proc_cursor; DEALLOCATE proc_cursor;如果还需要做「还原」操作第二段的LEN(ProcName)需要减 4而不是原脚本里的减 3并且游标范围要排除kcb__%否则第一次执行后生成的多下划线名字会被再次扫进去。把修正后的版本贴回 Codex 重新审一遍确认没有重名风险后再到 SSMS 里准备执行。4.2 批量删除DROP 之前确认对象类型删除段的原脚本用where name like Users_%同样需要类型过滤。修正版把游标范围限制在真正的存储过程里DECLARE ProcName sysname; DECLARE del_cursor CURSOR LOCAL FAST_FORWARD FOR SELECT p.name FROM sys.procedures AS p WHERE p.name LIKE Users_%; OPEN del_cursor; FETCH NEXT FROM del_cursor INTO ProcName; WHILE FETCH_STATUS 0 BEGIN IF OBJECT_ID(dbo. ProcName, P) IS NOT NULL BEGIN DECLARE Sql nvarchar(300) NDROP PROCEDURE dbo. QUOTENAME(ProcName); PRINT Sql; EXEC sys.sp_executesql Sql; END FETCH NEXT FROM del_cursor INTO ProcName; END; CLOSE del_cursor; DEALLOCATE del_cursor;QUOTENAME会处理名称里的空格和保留字OBJECT_ID再兜底一次。这个版本先不要放在生产库跑最好在测试库执行一遍把 PRINT 出来的语句清单发给 Codex 确认等清单里每条都确实是你想删的存储过程再复制到目标环境运行。消耗的 Token 和这次对话一样都会记在 TaoToken 控制台里。5. SSMS 执行前要确认的事和这次配置可能碰到的报错5.1 Codex 只审不执行最终操作留在 SSMS无论 Codex 给出多详细的风险清单它都不应该被拿去直连生产库执行命令。正确顺序是在 SSMS 里开一个查询窗口把第 4 节的脚本粘贴进去先看打印出来的将要执行清单再决定是否运行。重命名脚本可以用事务包住跑完检查sys.procedures里的名字变化发现问题就 ROLLBACK删除脚本涉及 DROP建议先把sys.procedures的查询结果存到一张临时表作为回退依据。如果脚本在执行时报出原文没有的新错误比如对象名无效或重复重命名把完整报错贴回 Codex它会基于这段报错给出下一步 SQL。整个过程依旧是Codex 生成或解释 SQL你在本地执行再把结果贴回对话它不直接触碰任何生产机器。5.2 配置和执行的报错对照Codex 返回 401先检查CODEX_API_KEY是否等于控制台里复制的 Key注意不要混入多余空格返回 404优先检查base_url是否写成了带/v1的地址TaoToken 的 API 地址是https://taotoken.net/api末尾不带/v1。SSMS 那边如果报「已存在名为...的对象」说明SP_RENAME的目标名已存在需要先查sys.procedures确认报「不是过程」则说明游标选到了表或视图改用sys.procedures的版本即可。Codex 审查请求正常返回后这次调用的 Token 消耗会出现在 TaoToken 控制台里。如果以后想把批量 SQL 走查固定下来可以在 模型对话 里用同一把 Key 发一条测试消息确认模型使用习惯再看 Coding Plan 是否覆盖每月的走查量需要重新创建 Key就去 控制台 API Keys。下次拿到类似的批量删改脚本先让 Codex 审一遍再回 SSMS 动手心里会踏实很多。