2008-10-17 62 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'