【转】如何从SharePoint Content DB中查询List数据***
SharePoint用來維護基礎(chǔ)數(shù)據(jù)非常方便,只需要建立自定義列表,然后使用InfoPath自定義一下維護界面,就可以實現(xiàn)在線的增刪改查,開發(fā)效率很高。如果維護的數(shù)據(jù)需要進行審批,還可以加入工作流功能。使用SharePoint Designer可以快速開發(fā)出簡單的工作流,如果是很復(fù)雜的工作流,那么就需要使用VS進行開發(fā)了。現(xiàn)在數(shù)據(jù)已經(jīng)維護進了SharePoint List,那么怎么從數(shù)據(jù)庫中將維護的數(shù)據(jù)查詢出來呢?
SharePoint 的列表數(shù)據(jù)都存儲在Content DB中,其中最最重要的表就是[dbo].[AllUserData],這個表中的一行數(shù)據(jù)就對應(yīng)SharePoint List中的一條數(shù)據(jù)。下面介紹下如何從Content DB中查詢出List數(shù)據(jù)。
Case 1簡單數(shù)據(jù)類型的自定義列表查詢
假設(shè)我們現(xiàn)在有一個Country列表,記錄了全球200多個國家和地區(qū)的中文名,英文名,建國日期,面積,人口等信息,整個列表只有字符串、日期、數(shù)字等簡單類型,沒有User,Lookup等數(shù)據(jù)類型,則整個List的數(shù)據(jù)都可以從[dbo].[AllUserData]查詢獲得,具體查詢步驟:
1. 查詢[dbo].[AllLists]找到ListId。
select * from [dbo].[AllLists] where</span> tp_Title ='Country'由于整個網(wǎng)站集都是共用一個Content DB數(shù)據(jù)庫,所以可能會出現(xiàn)在多個網(wǎng)站中都創(chuàng)建了Country這個List的情況,那么就會返還多條結(jié)果,這個情況下,就需要關(guān)聯(lián)AllWebs表,根據(jù)網(wǎng)站的Url來判斷到底哪個ListId才是我們需要的。
select w.FullUrl,l.tp_ID from [dbo].[AllLists] l inner join [dbo].[AllWebs] w on l.tp_WebId=w.Id where l.tp_Title = 'Country'在找到了ListId后,接下來所有查詢都會用到這個Id。
2. 查詢[dbo].[AllUserData],找到需要查詢的列,并命名為別名。
假設(shè)第一步我們查詢出來的ListId是'F20E316B-EA24-4164-9437-BBB17C182691',那么我們查詢Country這個列表的所有數(shù)據(jù)的SQL就是:
<span style="color:#000000"><span style="color:#0000ff">SELECT</span> * <span style="color:#0000ff">FROM</span> AllUserData <span style="color:#0000ff">where</span> tp_ListId=<span style="color:#006080">'F20E316B-EA24-4164-9437-BBB17C182691'</span></span>這個表的列非常多,在SharePoint 2013的環(huán)境中會更多,但是存儲數(shù)據(jù)的列都是用“數(shù)據(jù)類型+數(shù)字”來命名的。所以如果要找建國日期這個字段對應(yīng)的列,那么就去看datetime1 datetime2等,如果要找面積,人口等數(shù)值類型的列,那就去看float1 float2等;如果要找中文名,英文名之類的字符串列,那就要看nvarchar1 nvarchar3等列。這里基本上都是靠眼睛來看的,根據(jù)查詢的結(jié)果推斷哪些字段存儲了哪些數(shù)據(jù)。在得知每個字段的對應(yīng)后,即可修改查詢,將別名加上。
<span style="color:#000000"><span style="color:#0000ff">SELECT</span> d.nvarchar1 <span style="color:#0000ff">as</span> ChineseName, d.nvarchar3 <span style="color:#0000ff">as</span> EnglishName, d.datetime1 <span style="color:#0000ff">as</span> FoundingDate, d.float1 <span style="color:#0000ff">as</span> Area, d.float2 <span style="color:#0000ff">as</span> Population <span style="color:#0000ff">FROM</span> AllUserData d <span style="color:#0000ff">where</span> tp_ListId=<span style="color:#006080">'F20E316B-EA24-4164-9437-BBB17C182691'</span></span>【注意:SharePoint并沒有在數(shù)據(jù)庫中以很方便的結(jié)構(gòu)展現(xiàn)哪些列表字段對應(yīng)哪個數(shù)據(jù)庫字段,在AllLists表中,雖然有個字段tp_Fields,但是在SharePoint2010及之后,該字段是壓縮的二進制,使用SQL是無法讀取的。所以根本不可能通過查詢數(shù)據(jù)庫得知哪個字段的別名是什么。】參考:http://stackoverflow.com/questions/8988098/how-could-i-find-the-fields-of-a-sharepoint-list-from-database-in-sharepoint-201
3. 過濾掉已刪除的數(shù)據(jù)。
如果數(shù)據(jù)經(jīng)過刪除,然后又重新錄入,那么我們就會發(fā)現(xiàn),第2步的查詢結(jié)果會把刪除的和重新錄入的數(shù)據(jù)都查詢出來。SharePoint采用的刪除方法都是軟刪除,通過設(shè)置一個標(biāo)志位來表示一條數(shù)據(jù)已經(jīng)被刪除,所以我們只需要將刪除標(biāo)識tp_DeleteTransactionId=0添加到where條件中,即可將未刪除的數(shù)據(jù)返回。
<span style="color:#000000"><span style="color:#0000ff">SELECT</span> d.nvarchar1 <span style="color:#0000ff">as</span> ChineseName, d.nvarchar3 <span style="color:#0000ff">as</span> EnglishName, d.datetime1 <span style="color:#0000ff">as</span> FoundingDate, d.float1 <span style="color:#0000ff">as</span> Area, d.float2 <span style="color:#0000ff">as</span> Population <span style="color:#0000ff">FROM</span> AllUserData d <span style="color:#0000ff">where</span> tp_ListId=<span style="color:#006080">'F20E316B-EA24-4164-9437-BBB17C182691'</span> <span style="color:#0000ff">and</span> d.tp_DeleteTransactionId=0</span>4. 過濾掉歷史版本的數(shù)據(jù)。
如果這個列表開啟了版本控制,那么我們查詢的結(jié)果可能包含多個版本的數(shù)據(jù),而我們只需要最新版本的數(shù)據(jù),不希望歷史版本數(shù)據(jù)出現(xiàn)在查詢中。AllUserData表中,使用tp_IsCurrentVersion字段來標(biāo)識這條數(shù)據(jù)是最新的當(dāng)前版本還是歷史版本。
于是,查詢最新版本的SQL改為:
<span style="color:#000000"><span style="color:#0000ff">SELECT</span> d.nvarchar1 <span style="color:#0000ff">as</span> ChineseName, d.nvarchar3 <span style="color:#0000ff">as</span> EnglishName, d.datetime1 <span style="color:#0000ff">as</span> FoundingDate, d.float1 <span style="color:#0000ff">as</span> Area, d.float2 <span style="color:#0000ff">as</span> Population <span style="color:#0000ff">FROM</span> AllUserData d <span style="color:#0000ff">where</span> tp_ListId=<span style="color:#006080">'F20E316B-EA24-4164-9437-BBB17C182691'</span> <span style="color:#0000ff">and</span> d.tp_DeleteTransactionId=0 <span style="color:#0000ff">and</span> d.tp_IsCurrentVersion=1 </span>5. 過濾掉內(nèi)容審批未通過的數(shù)據(jù)。
如果這個列表開啟了內(nèi)容審批,那么就會出現(xiàn)多個最新版本的情況,一個是已經(jīng)被審批通過的版本,另一個是修改后還沒有進行審批的版本。一般來說,我們是希望只有審批通過的才查詢出來,用戶進行修改后,只要審批狀態(tài)不是Approve,那么就不應(yīng)該出現(xiàn)在查詢結(jié)果中。在AllUserData表中,使用tp_ModerationStatus字段來標(biāo)識這行數(shù)據(jù)是否已經(jīng)被審批通過。這是一個枚舉類型,其值為:
0 The list item is approved.?
1 The list item has been denied approval.?
2 The list item is pending approval.?
3 The list item is in the draft or checked out state.?
4 The list item is scheduled for automatic approval at a future date.
這里,我們只要審批通過的數(shù)據(jù),所以我們的SQL更新為:
<span style="color:#000000"><span style="color:#0000ff">SELECT</span> d.nvarchar1 <span style="color:#0000ff">as</span> ChineseName, d.nvarchar3 <span style="color:#0000ff">as</span> EnglishName, d.datetime1 <span style="color:#0000ff">as</span> FoundingDate, d.float1 <span style="color:#0000ff">as</span> Area, d.float2 <span style="color:#0000ff">as</span> Population <span style="color:#0000ff">FROM</span> AllUserData d <span style="color:#0000ff">where</span> tp_ListId=<span style="color:#006080">'F20E316B-EA24-4164-9437-BBB17C182691'</span> <span style="color:#0000ff">and</span> d.tp_DeleteTransactionId=0 <span style="color:#0000ff">and</span> d.tp_IsCurrentVersion=1 <span style="color:#0000ff">and</span> tp_ModerationStatus=0 </span>Case 2引用(Lookup)其他列表的自定義列表查詢
若要將關(guān)系數(shù)據(jù)維護到SharePoint中,那么Lookup數(shù)據(jù)類型是非常常用的實現(xiàn)方法。使用Lookup可以很容易實現(xiàn)一對多和多對多關(guān)系,關(guān)于多對多關(guān)系,我們在Case3中再進行講解,先看看一對多關(guān)系的維護與查詢。
緊接著Case1,現(xiàn)在我們需要創(chuàng)建一個用戶表,里面記錄了用戶的姓名,生日,出生國等信息,出生國字段對應(yīng)的就是Lookup Country這個List,用戶出生國不能亂填,必須從現(xiàn)有Country中進行選擇,而且只能選擇一個,這就是典型的一對多關(guān)系。
做過數(shù)據(jù)庫設(shè)計的都應(yīng)該知道,對于一對多關(guān)系,需要使用一個表添加另一個表的主鍵來作為外鍵,如果是數(shù)據(jù)庫表的話,那么User表中必然有個BirthCountryId列。那么在SharePoint中,所有列表都存儲在AllUserData表中,那這種關(guān)系怎么表示呢?
AllUserData表中有很多int1 int2之類的整型字段,但是這些字段并不用于存儲數(shù)值類型(數(shù)值類型使用float1 float2等存儲),而是用于存儲Lookup表的外鍵。查詢具有Lookup字段的自定義列表的操作如下:
1. 查詢外鍵表。
這里Country表是User表的外鍵表,所以先將Country表查出來,查的字段必須包含tp_ID,這個整型主鍵值就是用作外鍵關(guān)聯(lián)的。
<span style="color:#000000"><span style="color:#0000ff">SELECT</span> d.tp_ID, d.nvarchar1 <span style="color:#0000ff">as</span> ChineseName, d.nvarchar3 <span style="color:#0000ff">as</span> EnglishName, d.datetime1 <span style="color:#0000ff">as</span> FoundingDate, d.float1 <span style="color:#0000ff">as</span> Area, d.float2 <span style="color:#0000ff">as</span> Population <span style="color:#0000ff">FROM</span> AllUserData d <span style="color:#0000ff">where</span> tp_ListId=<span style="color:#006080">'F20E316B-EA24-4164-9437-BBB17C182691'</span> <span style="color:#0000ff">and</span> d.tp_DeleteTransactionId=0 <span style="color:#0000ff">and</span> d.tp_IsCurrentVersion=1 <span style="color:#0000ff">and</span> tp_ModerationStatus=0 </span>2. 查詢主表。
對于我們的主表User表,查詢方法跟Case1的步驟一樣,找到ListId,找到需要的字段,同時需要找到外鍵的關(guān)聯(lián)字段,也就是int1 int2這種字段。
<span style="color:#000000"><span style="color:#0000ff">SELECT</span> d.nvarchar1 <span style="color:#0000ff">as</span> UserChineseName, d.nvarchar3 <span style="color:#0000ff">as</span> UserEnglishName, d.datetime1 <span style="color:#0000ff">as</span> Birthdate, d.int1 <span style="color:#0000ff">as</span> CountryId <span style="color:#0000ff">FROM</span> AllUserData d <span style="color:#0000ff">where</span> tp_ListId=<span style="color:#006080">'53B70F07-3A66-4947-8560-05C5CCCE6A21'</span> <span style="color:#0000ff">and</span> d.tp_DeleteTransactionId=0 <span style="color:#0000ff">and</span> d.tp_IsCurrentVersion=1 <span style="color:#0000ff">and</span> tp_ModerationStatus=0 </span>3. Join兩個查詢結(jié)果。
現(xiàn)在看來,前兩步的查詢就像是兩個獨立的表一樣了,那么接下來我們只需要把主表和外鍵表進行關(guān)聯(lián)查詢,即可。比如我們需要查詢用戶的姓名,生日,出生地國家中文名,那么對應(yīng)的SQL就是:
<span style="color:#000000"><span style="color:#0000ff">SELECT</span> d.nvarchar1 <span style="color:#0000ff">as</span> UserChineseName, d.nvarchar3 <span style="color:#0000ff">as</span> UserEnglishName, d.datetime1 <span style="color:#0000ff">as</span> Birthdate, c.ChineseName <span style="color:#0000ff">as</span> BirthCountryChineseName <span style="color:#0000ff">FROM</span> AllUserData d <span style="color:#0000ff">inner</span> <span style="color:#0000ff">join</span> ( <span style="color:#0000ff">SELECT</span> d.tp_ID, d.nvarchar1 <span style="color:#0000ff">as</span> ChineseName, d.nvarchar3 <span style="color:#0000ff">as</span> EnglishName, d.datetime1 <span style="color:#0000ff">as</span> FoundingDate, d.float1 <span style="color:#0000ff">as</span> Area, d.float2 <span style="color:#0000ff">as</span> Population <span style="color:#0000ff">FROM</span> AllUserData d <span style="color:#0000ff">where</span> tp_ListId=<span style="color:#006080">'F20E316B-EA24-4164-9437-BBB17C182691'</span> <span style="color:#0000ff">and</span> d.tp_DeleteTransactionId=0 <span style="color:#0000ff">and</span> d.tp_IsCurrentVersion=1 <span style="color:#0000ff">and</span> tp_ModerationStatus=0 ) c <span style="color:#0000ff">on</span> d.int1=c.tp_ID <span style="color:#0000ff">where</span> tp_ListId=<span style="color:#006080">'53B70F07-3A66-4947-8560-05C5CCCE6A21'</span> <span style="color:#0000ff">and</span> d.tp_DeleteTransactionId=0 <span style="color:#0000ff">and</span> d.tp_IsCurrentVersion=1 <span style="color:#0000ff">and</span> tp_ModerationStatus=0 </span>當(dāng)然,我們可以對這個查詢進行簡化,把不需要查詢返回的字段都刪掉。
Case 3引用其他列表并可多選的自定義列表查詢
前面只是說的一對多情況的關(guān)系,但是要在關(guān)系數(shù)據(jù)庫中實現(xiàn)多對多關(guān)系,那么就需要用到中間表。同樣的道理,在SharePoint中,Lookup字段可以設(shè)置成多選,那么就變成了多對多關(guān)系,對應(yīng)數(shù)據(jù)庫中使用[dbo].[AllUserDataJunctions]這個表來實現(xiàn)多對多關(guān)聯(lián)。
我們還是用Case2中的用戶表和國家表舉例,如果我們?yōu)橛脩舯硖砑訃侄?#xff0c;由于有些國家允許雙重國籍,所以用戶和國家就變成了多對多關(guān)系。與一對多中使用tp_ID進行關(guān)聯(lián)不一樣,在多對多關(guān)聯(lián)中,使用的是主表的Doc_Id和Lookup表的tp_ID進行關(guān)聯(lián)。查詢步驟如下:
1. 查詢被Lookup的表。同Case2,不再累述。
2. 查詢主表,需要tp_DocId字段。查詢雷同Case2,只是需要多添加一個tp_DocId字段。
3. 查詢中間表,主要是tp_DocId和tp_Id兩個字段。
中間表的聯(lián)合主鍵字段較多,where條件比較復(fù)雜,如果主表和Lookup的表只存在一個多對多關(guān)系,那么我們可以寫成:
<span style="color:#000000"><span style="color:#0000ff">select</span> tp_DocId,tp_Id <span style="color:#0000ff">from</span> [dbo].[AllUserDataJunctions] <span style="color:#0000ff">where</span> tp_SourceListId=<span style="color:#006080">'53B70F07-3A66-4947-8560-05C5CCCE6A21'</span> <span style="color:#0000ff">and</span> tp_DeleteTransactionId=0 <span style="color:#0000ff">and</span> tp_IsCurrentVersion=1</span>如果主表和Lookup表存在多個多對多關(guān)系,那么我們還需要知道這里要查詢的多對多是哪個字段的多對多。關(guān)于FieldId,并不能很簡單的通過界面看到,我只找到通過代碼或者SPCAMLQueryHelper這樣的第三方工具才能查看。在得知了FieldId后,我們的查詢便可改為:
<span style="color:#000000"><span style="color:#0000ff">select</span> tp_DocId,tp_Id <span style="color:#0000ff">from</span> [dbo].[AllUserDataJunctions] <span style="color:#0000ff">where</span> tp_SourceListId=<span style="color:#006080">'53B70F07-3A66-4947-8560-05C5CCCE6A21'</span> <span style="color:#0000ff">and</span> tp_DeleteTransactionId=0 <span style="color:#0000ff">and</span> tp_IsCurrentVersion=1 <span style="color:#0000ff">and</span> tp_FieldId=<span style="color:#006080">'48DCB501-EBFD-4727-85AE-9CC9A51E73CF'</span></span>4. 聯(lián)合查詢主表、Lookup表和中間表。
前面三個步驟我們已經(jīng)得到了三個獨立的表查詢,接下來我們就可以按照普通的三個表進行Join查詢的方式,將結(jié)果查詢出來。
<span style="color:#000000"><span style="color:#0000ff">select</span> main.*,lkup.ChineseName <span style="color:#0000ff">as</span> Nationality <span style="color:#0000ff">from</span> ( <span style="color:#0000ff">SELECT</span> d.tp_DocId, d.nvarchar1 <span style="color:#0000ff">as</span> UserChineseName, d.nvarchar3 <span style="color:#0000ff">as</span> UserEnglishName, d.datetime1 <span style="color:#0000ff">as</span> Birthdate <span style="color:#0000ff">FROM</span> AllUserData d <span style="color:#0000ff">where</span> tp_ListId=<span style="color:#006080">'53B70F07-3A66-4947-8560-05C5CCCE6A21'</span> <span style="color:#0000ff">and</span> d.tp_DeleteTransactionId=0 <span style="color:#0000ff">and</span> d.tp_IsCurrentVersion=1 <span style="color:#0000ff">and</span> tp_ModerationStatus=0 )main <span style="color:#0000ff">inner</span> <span style="color:#0000ff">join</span> ( <span style="color:#0000ff">select</span> tp_DocId,tp_Id <span style="color:#0000ff">from</span> [dbo].[AllUserDataJunctions] <span style="color:#0000ff">where</span> tp_SourceListId=<span style="color:#006080">'53B70F07-3A66-4947-8560-05C5CCCE6A21'</span> <span style="color:#0000ff">and</span> tp_DeleteTransactionId=0 <span style="color:#0000ff">and</span> tp_IsCurrentVersion=1 <span style="color:#0000ff">and</span> tp_FieldId=<span style="color:#006080">'48DCB501-EBFD-4727-85AE-9CC9A51E73CF'</span> )m2m <span style="color:#0000ff">on</span> main.tp_DocId=m2m.tp_DocId <span style="color:#0000ff">inner</span> <span style="color:#0000ff">join</span> ( <span style="color:#0000ff">SELECT</span> d.tp_ID, d.nvarchar1 <span style="color:#0000ff">as</span> ChineseName, d.nvarchar3 <span style="color:#0000ff">as</span> EnglishName, d.datetime1 <span style="color:#0000ff">as</span> FoundingDate, d.float1 <span style="color:#0000ff">as</span> Area, d.float2 <span style="color:#0000ff">as</span> Population <span style="color:#0000ff">FROM</span> AllUserData d <span style="color:#0000ff">where</span> tp_ListId=<span style="color:#006080">'F20E316B-EA24-4164-9437-BBB17C182691'</span> <span style="color:#0000ff">and</span> d.tp_DeleteTransactionId=0 <span style="color:#0000ff">and</span> d.tp_IsCurrentVersion=1 <span style="color:#0000ff">and</span> tp_ModerationStatus=0 )lkup <span style="color:#0000ff">on</span> m2m.tp_Id=lkup.tp_ID</span>【注意:這里使用的都是Inner Join,那是因為我們認(rèn)為多選的Lookup是必選的,最少需要選一個,如果是允許不選的,那么就需要改寫為Left Join?!?/span>
Case 4包含用戶或用戶組類型的自定義列表用戶查詢
在SharePoint自定義列表的數(shù)據(jù)類型中,除了前面Case提到的基本數(shù)據(jù)類型和Lookup類型外,還有比較常用的就是Person or Group類型。SharePoint Content DB的User數(shù)據(jù),存儲在[dbo].[UserInfo]表中,在AllUserData中,只需要存儲User的ID(int類型)即可。UserId和Lookup表一樣,是占用的int4 int5這樣的int類型的列,但具體是int幾那需要根據(jù)實際情況用肉眼去看。另外在AllUserData中有兩個常用的UserId,那就是tp_Author和tp_Editor,表示該行數(shù)據(jù)的創(chuàng)建人和修改人。
關(guān)于UserInfo表需要注意的是,這個表的主鍵是[tp_SiteID],[tp_ID],也就是說只通過UserId去Join的話,可能會找到多條數(shù)據(jù),在不同的Site中,UserId是可能重復(fù)的。
還是以Case2的用戶為例,我們希望知道每條用戶數(shù)據(jù)最后是誰編輯的,將編輯者的登錄名顯示出來。那么我們需要進行如下操作:
1. 查詢用戶表,并包含tp_Editor列。與Case2相似,這個不再累述。
2. 查詢UserInfo表,將該用戶表所在的Site作為過濾條件。
關(guān)于SiteId,我們可以在AllUserData中找到,就是tp_SiteID字段。
<span style="color:#000000"><span style="color:#0000ff">select</span> tp_ID,tp_Login <span style="color:#0000ff">from</span> [dbo].[UserInfo] u <span style="color:#0000ff">where</span> u.tp_SiteID=<span style="color:#006080">'C4994C7F-ABEF-4D61-9126-086EBE8AE4D5'</span></span>3. 聯(lián)合查詢用戶表和UserInfo表,將編輯者的登錄名添加到查詢結(jié)果中。
<span style="color:#000000"><span style="color:#0000ff">SELECT</span> d.nvarchar1 <span style="color:#0000ff">as</span> UserChineseName, d.nvarchar3 <span style="color:#0000ff">as</span> UserEnglishName, d.datetime1 <span style="color:#0000ff">as</span> Birthdate, d.int1 <span style="color:#0000ff">as</span> CountryId, users.tp_Login <span style="color:#0000ff">as</span> EditorLoginName <span style="color:#0000ff">FROM</span> AllUserData d <span style="color:#0000ff">inner</span> <span style="color:#0000ff">join</span> ( <span style="color:#0000ff">select</span> tp_ID,tp_Login <span style="color:#0000ff">from</span> [dbo].[UserInfo] u <span style="color:#0000ff">where</span> u.tp_SiteID=<span style="color:#006080">'C4994C7F-ABEF-4D61-9126-086EBE8AE4D5'</span> ) users <span style="color:#0000ff">on</span> d.tp_Editor=users.tp_ID <span style="color:#0000ff">where</span> tp_ListId=<span style="color:#006080">'53B70F07-3A66-4947-8560-05C5CCCE6A21'</span> <span style="color:#0000ff">and</span> d.tp_DeleteTransactionId=0 <span style="color:#0000ff">and</span> d.tp_IsCurrentVersion=1 <span style="color:#0000ff">and</span> tp_ModerationStatus=0 </span>Case 5包含用戶或用戶組類型的自定義列表用戶組查詢
Case4這里只是查詢了用戶,如果我們添加的是一個用戶組的數(shù)據(jù),那么就不能再從UserInfo表中進行查詢,而是要從[dbo].[Groups]中進行查詢。
Groups表的主鍵和UserInfo很相似,也是[SiteId],[ID]。而且Groups表和UserInfo表的ID使用的是同一套Sequence。也就是說,如果對于某一個SiteId,我們在UserInfo表中有1,2,3這三個ID的用戶,那么我們肯定在Groups中找不到同樣ID的Group,GroupID和UserID是不會重復(fù)的,這樣就避免了在關(guān)聯(lián)AllUserData時Confused。
AllUserData表中并沒有一個標(biāo)識說關(guān)聯(lián)的到底是UserInfo表還是Groups表,所以我們在查詢時,可能需要將Groups的數(shù)據(jù)和UserInfo的數(shù)據(jù)Union起來然后在和AllUserData進行Join查詢。
更普遍的情況是,我們其實并不關(guān)心Group的信息,我們更希望得到的是AllUserData和GroupMember的列表,這個時候我們就還需要Join [dbo].[GroupMembership]表。
以用戶數(shù)據(jù)表為例,假設(shè)我們添加了一個用戶或用戶組的列“審批人”用以表示該用戶的數(shù)據(jù)由哪些人審批。該列填入的數(shù)據(jù)都是SharePoint中建立的用戶組。那么我們要查詢出用戶的審批人列表,那么操作如下:
1. 查詢用戶數(shù)據(jù)。這里需要關(guān)注的是int類型的列,審批人這個字段就存儲在int列中。
2. 查詢Groups表和GroupMembership表,獲得用戶組的信息。當(dāng)然,這里也需要Join到UserInfo表,找到真正的Membership的登錄名。
<span style="color:#000000"><span style="color:#0000ff">select</span> g.ID,u.tp_Login <span style="color:#0000ff">from</span> [dbo].[Groups] g <span style="color:#0000ff">inner</span> <span style="color:#0000ff">join</span> [dbo].[GroupMembership] gm <span style="color:#0000ff">on</span> g.ID=gm.GroupId <span style="color:#0000ff">and</span> g.SiteId=gm.SiteId <span style="color:#0000ff">inner</span> <span style="color:#0000ff">join</span> [dbo].[UserInfo] u <span style="color:#0000ff">on</span> u.tp_ID=gm.MemberId <span style="color:#0000ff">and</span> u.tp_SiteID=gm.SiteId <span style="color:#0000ff">where</span> g.SiteId=<span style="color:#006080">'C4994C7F-ABEF-4D61-9126-086EBE8AE4D5'</span></span>3. 將步驟1、2的查詢結(jié)果進行Join,便可得到用戶的審批人。
<span style="color:#000000"><span style="color:#0000ff">SELECT</span> d.nvarchar1 <span style="color:#0000ff">as</span> UserChineseName, d.nvarchar3 <span style="color:#0000ff">as</span> UserEnglishName, d.datetime1 <span style="color:#0000ff">as</span> Birthdate, d.int1 <span style="color:#0000ff">as</span> CountryId, users.tp_Login <span style="color:#0000ff">as</span> Approvers <span style="color:#0000ff">FROM</span> AllUserData d <span style="color:#0000ff">left</span> <span style="color:#0000ff">join</span> ( <span style="color:#0000ff">select</span> g.ID,u.tp_Login <span style="color:#0000ff">from</span> [dbo].[Groups] g <span style="color:#0000ff">inner</span> <span style="color:#0000ff">join</span> [dbo].[GroupMembership] gm <span style="color:#0000ff">on</span> g.ID=gm.GroupId <span style="color:#0000ff">and</span> g.SiteId=gm.SiteId <span style="color:#0000ff">inner</span> <span style="color:#0000ff">join</span> [dbo].[UserInfo] u <span style="color:#0000ff">on</span> u.tp_ID=gm.MemberId <span style="color:#0000ff">and</span> u.tp_SiteID=gm.SiteId <span style="color:#0000ff">where</span> g.SiteId=<span style="color:#006080">'C4994C7F-ABEF-4D61-9126-086EBE8AE4D5'</span> ) users <span style="color:#0000ff">on</span> d.int4=users.ID <span style="color:#0000ff">where</span> tp_ListId=<span style="color:#006080">'53B70F07-3A66-4947-8560-05C5CCCE6A21'</span> <span style="color:#0000ff">and</span> d.tp_DeleteTransactionId=0 <span style="color:#0000ff">and</span> d.tp_IsCurrentVersion=1 <span style="color:#0000ff">and</span> tp_ModerationStatus=0 </span>以上介紹了關(guān)于基本類型,Lookup類型,用戶和組類型的SharePoint數(shù)據(jù)庫查詢方法,對于其他的數(shù)據(jù)類型都可以當(dāng)做基本類型來對待:
- Multiple Text:ntext類型
- Choose:nvarchar類型
- Currency:float類型
- Yes/No:bit類型
- Hyperlink or Picture:nvarchar類型
- Calculated:看具體選擇的結(jié)果類型
- External Data:nvarchar ntext都會用到
- Managed Metadata:未研究
以上幾個Case的查詢已經(jīng)包含了大部分?jǐn)?shù)據(jù)查詢的情況,對于不同的數(shù)據(jù)列表,只需要稍作修改即可從SharePoint數(shù)據(jù)庫中查詢維護的列表。
總結(jié)
以上是生活随笔為你收集整理的【转】如何从SharePoint Content DB中查询List数据***的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 锐龙7000装机又省了 DDR5内存价格
- 下一篇: 【转】SharePoint 编程指南