SQL Server自定义REPLACE函数执行UPDATE后字段为空的问题
问题排查与解决方案
我来帮你分析下这个问题,你的UPDATE语句执行后字段变成NULL,而不是预期替换字符,主要是两个关键问题导致的:
问题根源
- 函数参数长度未指定:你定义的函数参数
@rawtxt NVARCHAR没有设置长度,在SQL Server中,NVARCHAR如果不指定长度,默认是1。这就意味着当你传入长度超过1的mongol字段值时,参数会被截断成第一个字符,导致函数里的WHERE r.mongol = @rawtxt根本匹配不到任何记录,@raw_mon变量会被赋值为NULL,最终函数返回NULL,UPDATE后字段自然变成NULL。 - 冗余的表查询逻辑:其实完全没必要在函数里去查询
raw表再做替换,直接对传入的参数执行REPLACE操作就可以了,多此一举的查询反而增加了出错的概率。
修正后的代码
第一步:修复自定义函数
我们需要给参数指定足够的长度,并且简化函数逻辑:
-- 用CREATE OR ALTER可以覆盖已存在的函数(SQL Server 2016+支持) CREATE OR ALTER FUNCTION dbo.convert_lat(@rawtxt NVARCHAR(50)) RETURNS NVARCHAR(50) AS BEGIN -- 直接对传入的文本执行替换操作,无需查表 RETURN REPLACE(@rawtxt, N'褎', 'f'); END; GO -- 如果你用的是SQL Server 2016之前的版本,先删除旧函数再创建 -- DROP FUNCTION IF EXISTS dbo.convert_lat; -- GO -- CREATE FUNCTION dbo.convert_lat(@rawtxt NVARCHAR(50)) -- RETURNS NVARCHAR(50) -- AS -- BEGIN -- RETURN REPLACE(@rawtxt, N'褎', 'f'); -- END; -- GO
第二步:执行UPDATE语句
现在再运行你的UPDATE语句,就能正常替换目标字符了:
UPDATE [Connection].[dbo].[raw] SET [mongol] = dbo.convert_lat(mongol) WHERE [mongol] LIKE N'褎%';
额外解释
- 原来的函数中,当参数被截断后,
r.mongol = @rawtxt找不到匹配的行,@raw_mon没有被赋值,默认就是NULL,所以函数返回NULL,导致UPDATE后字段变为NULL。 - 简化后的函数直接处理传入的参数,不管参数内容是什么,都会执行替换操作,既避免了匹配不到的问题,又提升了执行效率。
内容的提问来源于stack exchange,提问作者Xass1on
相关产品推荐
相关产品推荐

