2008-10-17 63 views
4

我需要获取网站集中所有文档的列表,我相信我可以通过alldocs表或alluserdata表(MOSS 2007 SP1 ),但没有看到我如何获得文档的作者信息。我不需要的文件(例如AllDocStreams内容)SharePoint 2007 - SQL Query查找网站集中的文档列表

像这样的内容:

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

MOSS提供多种webservices开箱即用,让生活变得更轻松。他们总是值得探索。

对于这个特殊的例子,我认为文章Getting a list of files from a MOSS document library using a SharePoint web service会有帮助。如果这不是你确切的情况,它会让你走上正轨。

如果文档服务不帮你,我肯定会搜索服务。检查文档的使用情况。

+0

我需要在服务器/ SQL级别执行此操作,因为IIS设置为超时2分钟(120秒),并且我们无法控制该基础架构部分以及为了实际部署代码产品(例如应用程序或Web部件)需要ar至少7天。 – PapaDaniel 2008-10-17 21:10:41

+0

这实际上是在做法律发现,并且只是获取整个网站集中所有文档的列表,以及创建它们的时间和名称。 – PapaDaniel 2008-10-17 21:12:09

0

通过将AllUserData.tp_Author加入UserInfo.tp_ID,您可以从UserInfo表中获得一些信息,但不建议在这些表中混淆,并且可能非常脆弱,并且您的查询也不能保证在将任何修补程序或服务包应用于SharePoint。我会使用webservices或SharePoint对象模型来访问数据。

4

为什么不使用sharepoint对象模型而不是使用原始数据库方法?我知道,与数据库相比,对象模型方法确实有性能损失,但MS可以使用下一个路径更改数据库模式。另一方面,MS打破自己的对象模型的可能性要小得多,据我所知推荐的方法是使用对象模型或Web服务。

5

不要直接查询SharePoint数据库。这是完全不受支持的,并可能让您陷入困境(例如,如果服务包或修补程序修改架构,那么您的应用程序已损坏)。

4

声称由于不支持而无法查询SharePoint数据库的人是错误的。从阅读文档,只要使用'With(NoLock)'子句就可以查询数据库。显然不支持更新,删除或插入记录。

下面的查询支持:

Select * 
From your_content_database.dbo.AllDocs With (NoLock) 

我将发布一个查询,提供在几分钟内期望的结果。

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 
1
  • 你为什么不使用Content Query web part
  • 为什么不使用search object查询相同?这将是我的首选解决方案。搜索已有大多数属性,如果需要它们,您可以添加更多属性。搜索可能比查询内容数据库快得多。

无论是否支持,直接查询内容数据库仍然是一种糟糕的形式,任何将此建议作为解决方案的开发人员都应该进行演讲;)。例如,如果管理员为您的webapp创建第二个内容数据库会发生什么?如果您查询的是网站集,则在代码中提供此信息之前,它不会返回所需的结果。

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语句:

select id, title, filetype, filesize, created, createdby from `shared documents` where filetype = '.gif'