MSSQL单表父子ID关联更新MailID及查询结果不全问题咨询
现有代码返回数据少的根因
- 筛选条件逻辑错误:你在填充
@MyTable的WHERE子句中添加了MailId is not NULL的限制,但符合ID like '%/%'的都是子项,子项的MailID本身就是NULL,符合要求的记录几乎不会被命中,自然返回数据量极少。 - 非法字符过滤逻辑不完整:当前
ID not like '%[a-z]%'只能排除小写字母,无法过滤大写字母、特殊符号等非法字符,会误排除部分符合规则的记录,也会漏放不符合ID格式要求的记录。 - 隐藏的报错风险:如果存在ID以
/结尾的异常记录,charindex('/', ID)-1会返回0,left函数执行会报错,导致查询提前中断,仅返回报错前的部分数据。
最优实现方案
不需要额外定义临时表,直接通过自连接即可一次完成更新,执行效率更高,逻辑也更清晰:
UPDATE child SET child.MailID = parent.MailID FROM [thisismy].[dbo].[table] AS child INNER JOIN [thisismy].[dbo].[table] AS parent -- 截取子项ID中/之前的部分作为父项ID匹配 ON parent.ID = LEFT(child.ID, CHARINDEX('/', child.ID) - 1) WHERE -- 仅处理子项(ID包含/) child.ID LIKE '%/%' -- 仅处理子项MailID为空的记录 AND child.MailID IS NULL -- 确保父项MailID有值 AND parent.MailID IS NOT NULL -- 校验ID仅包含数字、-、/三种字符 AND child.ID NOT LIKE '%[^0-9/-]%' AND parent.ID NOT LIKE '%[^0-9/-]%'
如果需要封装为存储过程,参考代码如下:
CREATE PROCEDURE dbo.SyncChildMailID AS BEGIN SET NOCOUNT ON; UPDATE child SET child.MailID = parent.MailID FROM [thisismy].[dbo].[table] AS child INNER JOIN [thisismy].[dbo].[table] AS parent ON parent.ID = LEFT(child.ID, CHARINDEX('/', child.ID) - 1) WHERE child.ID LIKE '%/%' AND child.MailID IS NULL AND parent.MailID IS NOT NULL AND child.ID NOT LIKE '%[^0-9/-]%' AND parent.ID NOT LIKE '%[^0-9/-]%' END GO
原有代码的其他问题
你注释的更新代码中关联的表变量名写错了,你定义的是@MyTable,但关联时写的是@IDAS,即使之前的临时表填充正确,更新语句也无法执行。
内容的提问来源于stack exchange,提问作者AstralSailor
相关产品推荐
相关产品推荐

