SharePoint 2007 - SQL查询以查找网站集中的文档列表

时间:2008-10-17 20:48:36

标签: sql sharepoint

我需要获取网站集中所有文档的列表,我相信我可以使用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

有更好的方法吗?

8 个答案:

答案 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)

  • 为什么不使用Content Query web part
  • 为什么不使用search object查询相同内容?这将是我的首选解决方案。搜索已包含大多数属性,您可以根据需要添加更多属性。搜索可能比查询内容数据库快得多。

无论是否支持,直接查询内容数据库仍然是不好的形式,任何建议将其作为解决方案的开发人员都应该参加讲座;)。例如,如果管理员为您的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对象模型来访问数据。