MSSQL游标批量加字段,把Codex Base URL改到TaoToken后再跑通动态ALTER TABLE
1. 游标还没裂exec 字符串里先冒烟TbPerson 分组遍历的经典翻车现场MSSQL 游标批量加字段这个活儿最大的麻烦不在游标本身而在exec()里拼方括号。最近我就被一段遍历TbPerson分组结果、再往TbPersonResult动态加列的脚本卡住了原本打算直接跑结果先是提示列名截断又是怀疑--处理结果把右括号吞掉最后决定让 Codex 帮我审一遍。当时顺着 TaoToken 把 Codex 的 API 通道指过去才把问题真正看透不是游标不会写而是动态 ALTER TABLE 的字符串拼接太容易被小细节绊倒。原始脚本的思路本身没问题TbPerson表里存着每个人按部位分组的数据比如左肩、右肩、颈部现在要把每个部位变成TbPersonResult表里的一个新字段。逻辑上等价于「先拿到部位清单再循环执行 ALTER TABLE ADD 列」。可一旦走进动态 SQL方括号、单引号、注释符、变量类型这些平时不起眼的东西全会变成雷区。最初版本的代码长这样我把关键部分拆开看DECLARE A1 VARCHAR(100) DECLARE YOUCURNAME CURSOR FOR SELECT [部位] FROM [dbo].[TbPerson] GROUP BY [部位] OPEN YOUCURNAME FETCH NEXT FROM youcurname INTO A1 WHILE (FETCH_STATUS 0) BEGIN PRINT A1 EXEC(ALTER TABLE TbPersonResult ADD [ A1 ] VARCHAR(200) --处理结果) FETCH NEXT FROM youcurname INTO A1 END CLOSE youcurname DEALLOCATE youcurname单独看结构游标声明、打开、循环、关闭、释放都没毛病FETCH NEXT也老老实实放在了循环末尾。真正需要重点检查的是中间那句EXEC[ A1 ]这种手工拼方括号的方式遇到特殊部位名就会出问题而且字符串尾巴上的--处理结果很容易把整个语句带偏。这个场景比「官方额度不够」更实际——不是模型不聪明是我们在把脚本交给 Codex 之前自己连报错信息都没看全。2. 给 Codex 换一条 API 通道TaoToken 拿 Key 并填进 config.toml要让 Codex 认真审查这段游标脚本前提是 Codex CLI 本身能正常发起对话。如果你之前一直卡在官方额度、多个 Key 来回换、或者不同模型要切不同 Base URL这一步可以统一收到 TaoToken 下面处理。TaoToken 做的事是把各家模型的 API 收敛成一个兼容通道你只需要在这一个控制台里创建 Key然后把 Base URL 填进 Codex 的配置文件之后让 Codex 去哪个模型由你选的模型 ID 决定。先去 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 注册并创建 API Key。创建完你会拿到一串类似sk-开头的密钥这篇文章里统一用YOUR_API_KEY占位。如果你还没想好选哪个模型不用急等会儿配置完去模型广场看当时的列表再填。Codex 的配置文件在~/.codex/config.toml。打开后把模型提供方指到 TaoToken注意 Base URL 填https://taotoken.net/api末尾不要带/v1也不要加任何 UTM 参数model_provider taotoken model 以模型广场ID为准 [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY然后在当前 shell 里导出环境变量Key 就是从官网创建的那把export TAOTOKEN_API_KEYYOUR_API_KEY这里有个容易混淆的点官网落地页网址是https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end但那是给人注册、看模型广场、查用量用的Codex 真正请求的接口地址是https://taotoken.net/api。两码事别把带 UTM 的网页链接填进base_url也别手贱在api后面多加个/v1。如果你用的是图形界面的 API 配置工具而不是 Codex CLI同样只要记住 Base URL 和 Key 两个值模型 ID 以 TaoToken 模型广场 当时列表为准。3. 让 Codex 拆开A1的拼法确认到底要不要 QUOTENAME配好之后我把上面那段游标脚本原封不动发给 Codex请它逐行审查动态 ALTER TABLE 的拼接。Codex 返回的第一个怀疑点就是手工方括号[ A1 ]。大部分情况下这么拼没问题比如 A1 是「左肩」拼出来就是[左肩]符合标识符规则。但只要部位名里出现]比如「右肩]外侧」这种脏数据拼出来的列名会变成[右肩]外侧]MSSQL 解析到第二个]就认为标识符结束了后面的外侧]直接变成语法垃圾。这时候 QUOTENAME 就能派上用场。QUOTENAME(A1)返回的是带正确转义的括号标识符如果 A1 内部本身包含]它会自动替换成]]从而保证整个字符串仍然是一个合法列名。Codex 给出的修正意见是不要手动拼[ A1 ]改用QUOTENAME(A1)。除了方括号Codex 还提醒了另一个和 MSSQL 中文环境强相关的点如果动态 SQL 字符串里直接带中文变量最好在EXEC前面加N前缀写成EXEC(N...)避免字符串在隐式转换时出现乱码。PRINT A1 时你能看到当前部位名但如果目标列的注释或者后续查询出现问号就要检查是不是少了这个 N。还有一个隐蔽问题来自字符串尾巴上的--处理结果。在原始脚本里它看起来像是把整段 SQL 拼完后追加了一个注释。可一旦EXEC的字符串拼接因为换行或者引号位置变化--很容易把真正的 SQL 尾部截断导致)或字符串结束符被注释掉报出莫名其妙的语法错误。正确做法是要么把注释挪到EXEC外面要么干脆去掉让动态 SQL 保持干净。Codex 帮我改出来的版本把--处理结果移到了循环里单独一行PRINT输出既不污染动态语句也能保留排错信息。游标本身也有一个高频复发点循环体内的FETCH NEXT如果写在END之后或者写了两遍都会造成游标不前进或者提前退出。修正后的脚本把FETCH NEXT放到循环末尾同时保留FETCH_STATUS 0作为唯一跳出条件这样至少不会死循环。4. 在 SSMS 里本地执行修正脚本把剩余报错再贴回来Codex 给出的最终脚本是一个可以直接放进 SSMS 运行的版本。注意这里有个边界Codex 只负责帮你审查、生成和解释 SQL它不会替你连到TbPersonResult表所在的数据库去执行。你需要把脚本复制到本地 SQL Server Management Studio 里跑再把执行结果或报错贴回对话让 Codex 继续判断。这个流程安全也符合 AI 编程工具的操作边界。我在测试库跑通的修正版长这样DECLARE A1 NVARCHAR(100) DECLARE YOUCURNAME CURSOR FOR SELECT [部位] FROM [dbo].[TbPerson] GROUP BY [部位] OPEN YOUCURNAME FETCH NEXT FROM youcurname INTO A1 WHILE (FETCH_STATUS 0) BEGIN PRINT N正在添加字段 A1 EXEC(NALTER TABLE dbo.TbPersonResult ADD QUOTENAME(A1) N VARCHAR(200)) FETCH NEXT FROM youcurname INTO A1 END CLOSE youcurname DEALLOCATE youcurname和原来相比主要改动是变量从VARCHAR改成NVARCHAR避免中文部位名在拼接时被截成乱码EXEC换成EXEC(N...)明确按 Unicode 处理[ A1 ]换成QUOTENAME(A1)--处理结果从动态 SQL 字符串里移除换成循环里的PRINT。跑完之后可以用下面的语句确认新列都建出来了SELECT name FROM sys.columns WHERE object_id OBJECT_ID(dbo.TbPersonResult) ORDER BY column_id如果你在本地执行时发现某些列没建出来多半是游标循环某一次EXEC报错后中断了。MSSQL 的游标一旦遇到错误默认不会自动继续。这时候可以给循环加一个简单的错误处理或者先用SELECT把部位清单查出来人工扫一眼确认没有异常字符。Codex 在这里只能帮你分析报错文本实际运行必须由你在 SSMS 里完成这个分工一定要明确。5. 跑通之后去控制台对一下这次调用还有两个容易复发的点脚本跑通之后先别急着关编辑器。打开 TaoToken 控制台 API Keys 看一样东西这次 Codex 对话产生的调用有没有正常记账。因为 Base URL 已经填成了https://taotoken.net/api所有发给 Codex 的请求都会经由 TaoToken 通道控制台用量列表里会多出来对应记录。如果这里显示调用量是 0说明 Codex 可能还在走原来的默认配置回去检查~/.codex/config.toml是否真的被 CLI 加载了。另外如果你同时也在用 Claude Code 或者 CC Switch 这类工具可以在 TaoToken 模型对话 里用同一把 Key 发一条测试消息确认 Key 本身有效免得把问题全归到 Base URL 上。需要长期写代码的话可以到 Coding Plan 看看套餐是否够用。Claude Code 的环境变量接入方式和 Codex 的 config.toml 不是一回事具体对照可以翻 Claude Code 接入文档。最后补两个以后还会再犯的小地方。第一个是游标声明里如果用了SCROLL锁FETCH NEXT的语义会变复杂这个场景不需要别画蛇添足。第二个是动态 SQL 里的列名长度VARCHAR(200)是字段类型定义不是列名长度限制MSSQL 标识符最长 128 字节如果部位名本身就接近这个长度QUOTENAME 之后可能超出限制执行时会报错。真遇到这种情况把部位名在进入游标前就截短或者改用别的字段命名策略。这两个点我在这次排障时都踩过写在最后算是给下一次留个记号。