我需要获取网站集中所有文档的列表,我相信我可以使用alldocs表或alluserdata表(MOSS 2007 SP1),但是看不到我如何获取作者的信息。文献。我不需要文档的内容(例如AllDocStreams内容)
这样的事情:
SELECT tp_DirName, tp_LeafName, tp_Version, tp_Modified, tp_Created
FROM AllUserData
WHERE (tp_ContentType = 'Document')
AND (tp_LeafName NOT LIKE '%.css')
AND (tp_LeafName NOT LIKE '%.jpg')
AND (tp_LeafName NOT LIKE '%.png')
AND (tp_LeafName NOT LIKE '%.wmf')
AND (tp_LeafName NOT LIKE '%.gif')
AND (tp_DirName NOT LIKE '%Template%')
AND (tp_IsCurrentVersion = 1)
AND (tp_LeafName NOT LIKE '%.xsl')
ORDER BY tp_SiteId, tp_ListId, tp_DirName, tp_LeafName, tp_IsCurrentVersion DESC
有更好的方法吗?
答案 0 :(得分:5)
声称由于不支持而无法查询SharePoint数据库的人是错误的。从阅读文档,只要您使用'With(NoLock)'子句,就可以查询数据库。显然不支持更新,删除或插入记录。
支持以下查询:
Select *
From your_content_database.dbo.AllDocs With (NoLock)
我会在几分钟内发布一个提供所需结果的查询。
答案 1 :(得分:4)
为什么不使用sharepoint对象模型而不是使用原始数据库方法?我知道对象模型方法与数据库相比确实存在性能损失,但MS可以使用下一个路径更改数据库模式。另一方面,MS打破他们自己的对象模型的可能性要小得多,据我所知,推荐的方法是使用对象模型或Web服务。
答案 2 :(得分:4)
不要直接查询SharePoint数据库。这是完全不受支持的,可能会让您在前进中遇到麻烦(例如,如果Service Pack或修补程序修改架构,那么您的应用程序将被破坏)。
答案 3 :(得分:3)
以下内容将返回过去24小时内添加到内容数据库的前100个最大文档。
Select Top 100
W.FullUrl,
W.Title,
L.tp_Title as ListTitle,
A.tp_DirName,
A.tp_LeafName,
A.tp_id ,
DS.Content ,
DS.Size,
D.DocLibRowID,
D.TimeCreated,
D.Size,
D.MetaInfoTimeLastModified,
D.ExtensionForFile
From your_content_database.dbo.AllLists L With (NoLock)
join your_content_database.dbo.AllUserData A With (NoLock)
On L.tp_ID=tp_ListId
join your_content_database.dbo.AllDocs D With (NoLock)
On A.tp_ListID=D.ListID
And A.tp_SiteID=D.SiteID
And A.tp_DirName=D.DirName
And A.tp_LeafName=D.LeafName
join your_content_database.dbo.AllDocStreams DS With (NoLock)
On DS.SiteID=A.tp_SiteID
And DS.ParentID=D.ParentID
And DS.ID=D.ID
join your_content_database.dbo.Webs W With (NoLock)
On W.ID=D.WebID
And W.ID=L.Tp_WebID
And W.SiteID=A.tp_SiteID
Where DS.DeleteTransactionID=0x
And D.DeleteTransactionID=0x
And D.IsCurrentVersion=1
And A.tp_DeleteTransactionID=0x
And A.tp_IsCurrentVersion=1
And D.HasStream=1
And L.tp_DeleteTransactionId=0x
And ExtensionForFile not in('webpart','dwp','aspx','xsn','master','rules','xoml')
And D.MetaInfoTimeLastModified>DateAdd(d,-1,GetDate())
Order by DS.Size desc
答案 4 :(得分:2)
我建议您查看Camelot .NET Connector,它允许您使用标准SQL查询来查询SharePoint 2007/2010。它是一个ADO.NET驱动程序,也可以通过简单的WCF服务和任何编程语言提供的驱动程序公开。假设有人想从“共享文档”中选择,你会写出类似的东西:
select * from `shared documents`
或某些列:
select id, title, filetype, filesize, created, createdby from `shared documents`
或where where statement:
select id, title, filetype, filesize, created, createdby from `shared documents` where filetype = '.gif'
答案 5 :(得分:1)
无论是否支持,直接查询内容数据库仍然是不好的形式,任何建议将其作为解决方案的开发人员都应该参加讲座;)。例如,如果管理员为您的webapp创建第二个内容数据库,会发生什么?如果您查询跨网站集,则在您在代码中提供此内容之前,它将不会返回所需的结果。
答案 6 :(得分:0)
MOSS提供了许多开箱即用的webservices,让生活变得更轻松。他们总是值得探索。
对于这个特定的例子,我认为文章Getting a list of files from a MOSS document library using a SharePoint web service会有所帮助。如果这不是您的确切方案,它将使您走上正确的轨道。
如果文档服务对您没有帮助,我确定搜索服务。查看文档以了解用法。
答案 7 :(得分:0)
您可以通过将AllUserData.tp_Author加入UserInfo.tp_ID来获取UserInfo表中的一些信息,但不建议在这些表中弄乱并且可能非常脆弱,并且您的查询在应用后也不能保证可以正常工作SharePoint的任何修补程序或Service Pack。我会使用webservices或SharePoint对象模型来访问数据。