Microsoft Graph API邮件ID不唯一问题及SQL语句排序规则应用咨询
解决Microsoft Graph邮件ID在SQL Server中重复的问题及语句级排序规则用法
首先得明确:Graph API返回的邮件ID是大小写敏感的(本质是经过编码的字符串,大小写不同代表不同的邮件),但SQL Server默认的排序规则大多不区分大小写,这才导致存储时把不同ID当成了重复值。
为什么你之前字段级/语句级的COLLATE没生效?
你之前在SELECT或JOIN里加COLLATE Latin1_General_CS_AS,只是查询环节临时改变字符串的比较规则,根本没影响到插入数据时的唯一性校验——插入时数据库还是按字段/表的默认排序规则判断,所以哪怕查询时区分大小写,存储时该重复还是重复。
如何在SQL语句里正确用排序规则解决问题?
如果你不想改表级排序规则,就得在涉及唯一性判断、精确匹配的关键环节都指定排序规则:
- 插入时强制区分大小写:插入数据时给ID字段指定排序规则,确保数据库按大小写敏感逻辑校验重复:
INSERT INTO Emails (Id, Subject, ...) VALUES ('AQMkADAwATM0MDAAMS0yMDQ4LWIxNWMtMDACLTAwCgBGAAAD...' COLLATE Latin1_General_CS_AS, '测试邮件', ...) - 查询时精确匹配大小写:如果要找某个特定大小写的ID,必须在WHERE里加COLLATE,否则会把大小写不同的结果也查出来:
SELECT * FROM Emails WHERE Id = 'AQMkADAwATM0MDAAMS0yMDQ4LWIxNWMtMDACLTAwCgBGAAAD...' COLLATE Latin1_General_CS_AS - JOIN时保持一致的排序规则:关联两个表的ID字段时,两边都要指定相同的大小写敏感排序规则,否则关联逻辑会忽略大小写:
SELECT e.Subject, a.FileName FROM Emails e JOIN Attachments a ON e.Id COLLATE Latin1_General_CS_AS = a.EmailId COLLATE Latin1_General_CS_AS - 给字段加唯一约束时指定排序规则:如果要确保ID字段绝对唯一,直接在唯一约束里指定排序规则,这样不管怎么插入,都会按大小写敏感判断:
ALTER TABLE Emails ADD CONSTRAINT UQ_Email_Id UNIQUE (Id COLLATE Latin1_General_CS_AS)
更省心的方案:字段级固定排序规则
其实没必要每次写语句都加COLLATE,建表时直接给ID字段指定大小写敏感的排序规则,后续所有操作默认都会遵循这个规则:
CREATE TABLE Emails ( Id VARCHAR(255) COLLATE Latin1_General_CS_AS PRIMARY KEY, Subject NVARCHAR(255), ReceivedTime DATETIME, ... )
内容的提问来源于stack exchange,提问作者JohnD
相关产品推荐
相关产品推荐

