如何利用SQL FORMATMESSAGE函数生成标准化的动态错误消息?

秋瑶吖_4264

秋瑶吖_4264

2026-07-03

255人浏览

原创

formatmessage是模板填充器而非错误生成器,仅返回格式化字符串;需配合raiserror或throw抛错,三种输入方式不可混用,参数类型数量须严格匹配,本地化占位符顺序必须一致,生产环境应补全元数据并防注入。

如何利用sql formatmessage函数生成标准化的动态错误消息?

FORMATMESSAGE 本身不生成错误,只返回格式化后的字符串;真要抛错,必须配合 RAISERROR 或 THROW。它不是“动态错误生成器”,而是“模板填充器”——用对了才可控,用错了连 NULL 都不报,静默失败。

FORMATMESSAGE 的三种输入方式不能混用

传第一个参数时,msg_number、'msg_string'、@msg_variable 行为完全不同,选错就得不到预期结果:

  • msg_number(如 50001):查 sys.messages,但仅限已用 sp_addmessage 注册的自定义错误(且 msg_number > 50000),系统错误号 ≤13000 一律返回 NULL
  • 'msg_string'(如 'User %s not found'):单引号内联,只支持 %s 占位符(不认 %d),最长 2047 字符,超长静默截断为 2044 + …
  • @msg_variable:变量类型必须是 nvarchar 或 varchar,内容得符合上述字符串规则;若声明为 varchar(100) 却存 200 字符,截断后占位符错位,填充结果不可信

本地化消息的占位符顺序必须严格对齐

同一 msg_number 在不同语言(如 language_id = 1033 英文 / 2052 中文)下注册时,%s、%d 出现的顺序和数量必须完全一致。否则 FORMATMESSAGE(50001, @user, @id) 在中文环境下可能把 @user 塞进数字位置。

验证方法:

SELECT msg_id, language_id, text
FROM sys.messages
WHERE msg_id = 50001 AND language_id IN (1033, 2052);

比对两行 text 中占位符的顺序——不是看语义通不通,是看 %s 第几个出现、%d 第几个出现。

Phidata
Phidata

Phidata是一款用于构建多模态 Agent 与工作流的开源 AI 框架。

下载

参数类型和数量必须硬匹配

FORMATMESSAGE 不校验参数个数与占位符是否一致:少给参数,%s 留原样;多给参数,多余值被丢弃;类型错则直接报错 Msg 1001 或返回 NULL:

  • %s 只接字符串,传 NULL → 整个结果变 NULL(不会转成空串)
  • %d / %i 只接受整数(INT、BIGINT),传 VARCHAR 会失败
  • 占位符有 2 个,就必须传 2 个参数,差一个都出问题

生产环境别只靠 FORMATMESSAGE 拼通知

单纯拼字符串漏上下文,比如没带时间、SPID、数据库名,排查时抓瞎。更稳妥的做法是把它当模板引擎一环:

  • 用 GETDATE()、@@SPID、DB_NAME() 补充运行时元数据
  • 若模板来自配置表或用户输入,先做 REPLACE(@input, '''', '''''') 防 SQL 注入
  • 加 TRY...CATCH 捕获 FORMATMESSAGE 自身失败(如参数类型错),避免通知逻辑中断

真正难的不是写那行 FORMATMESSAGE,而是确保每次取到的消息文本和当前语言、版本、sp_addmessage 注册状态一致——跨服务器迁移后,sp_addmessage 没重跑,msg_number 就查不到。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

3923

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

831

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1029

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5761

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2703

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5740

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7581

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1030

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

912

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习