SharePoint数据库AllDocStreams.Content无法存储完整Blob的问题排查
核心排查与解决方向
针对你提取*.0旧版本文档时Blob不完整的问题,排除AllFileFragments后,重点从以下关联表查询入手:
1. 关联Versions、AllDocVersions与AllDocStreams获取对应版本的完整Stream
SharePoint的文档版本数据分散在Versions、AllDocVersions和AllDocStreams三个表中,你可能仅查询了当前文档的Stream记录,而非旧版本对应的条目。正确关联查询逻辑如下:
SELECT ads.Content FROM Versions v INNER JOIN AllDocVersions adv ON v.VersionId = adv.VersionId INNER JOIN AllDocStreams ads ON adv.StreamId = ads.StreamId WHERE v.DirName = N'目标文档的站点相对路径' AND v.LeafName LIKE N'%.0' -- 匹配*.0格式的旧版本文件名
2. 大文件需从LargeObjectContent表拼接内容
如果目标文档是大文件(通常超过10MB),SharePoint会将Blob拆分存储在LargeObjectContent表中,而非仅存于AllDocStreams。需要按Sequence字段顺序拼接拆分的内容:
SELECT CONVERT(VARBINARY(MAX), ( SELECT loc.Content FROM LargeObjectContent loc WHERE loc.StreamId = ads.Id ORDER BY loc.Sequence ASC FOR XML PATH(''), TYPE ).value('.', 'VARBINARY(MAX)')) AS FullBlobContent FROM AllDocStreams ads INNER JOIN AllDocVersions adv ON ads.StreamId = adv.StreamId INNER JOIN Versions v ON adv.VersionId = v.VersionId WHERE v.DirName = N'目标文档的站点相对路径' AND v.LeafName LIKE N'%.0'
3. 避免过滤IsCurrent标记
查询时注意不要添加IsCurrent = 1的过滤条件,旧版本的IsCurrent字段值为0,过滤后会直接丢失对应版本的Stream数据。
内容的提问来源于stack exchange,提问作者TorskenK
相关产品推荐
相关产品推荐

