我可以通过这种方式使用ADODB连接到SharePoint列表:
Dim objCon As New ADODB.Connection
objCon.Open "Provider=Microsoft.ACE.OLEDB.12.0;WSS;IMEX=2;RetrieveIds=Yes;DATABASE=mysite/documents;LIST={xxxx-guid-xxxx};"
Dim rst As Recordset
Set rst = objCon.Execute("Select * from list1)
它正在工作:)。
现在,我想同时连接两个列表来进行内连接:
Set rst = objCon.Execute("Select * from list1 inner join list2)
但我找不到将第二个列表GUID放在连接字符串上的语法。我该怎么办?
答案 0 :(得分:0)
来自Microsoft http://msdn.microsoft.com/en-us/library/ee633650.aspx
不支持从多个列表中选择字段。您可以为每个列表创建数据集,并从每个数据集中选择字段。
我不知道您的环境,但对我来说,最简单的方法是创建指向SharePoint列表的2个链接表,然后您可以按照自己的方式操作数据。
答案 1 :(得分:0)
我知道这是一个较老的问题,但我试图尝试同样的努力,当我在寻找例子时,我通常会看到相同的答案"不可能"。
正如Thomas G指出的那样,它可以作为一个断开连接的记录集' (我通常将这些称为子查询),然后将两个列表连接在一起。
我的目标是避免首先将数据导入Excel只是为了运行带有列表的查询,因为我实际上是使用它将每周批量导入多个文件导入SharePoint中的多个列表。如果我可以首先避免它,我只是不想在Excel中处理数据维护/清理。 (这几个文件在导入过程中都使用了来自两个不同列表的数据)
根据原始问题,我已将代码简化为仅针对两个SharePoint列表检索Select查询的结果。代码是为Excel VBA编写的,但如果删除了Excel部件,则可以在任何VBA实例中使用。
Sub SQL_Two_SP_Lists()
Dim sp_sdbPath As String, sp_sConnect As String
Dim SP_List_1 As String, SP_List_2 As String
Dim c As Long
Dim cnSP As New ADODB.Connection
Dim rsSP As New ADODB.Recordset
sp_sdbPath = "https://your_SharePoint_URL_Here/"
sp_sConnect = "Provider=Microsoft.ACE.OLEDB.12.0;WSS;IMEX=2;RetrieveIds=Yes;DATABASE=" & sp_sdbPath & ";"
SP_List_1 = "LIST={List 1 GUID Here}" 'i.e. xxxx-guid-xxxx
SP_List_2 = "LIST={List 2 GUID Here}" 'Go to List settings > Information Management Policy Settings > GUID is in the URL
'Establish a connection to the first List
cnSP = sp_sConnect + SP_List_1
cnSP.Open
'Write the SQL & Establish a connection to the second List as a sub-query using IN
sSQL = "SELECT A.*, B.* " + _
"FROM List A " + _
"INNER JOIN (Select * From LIST IN 'DATABASE=" & sp_sdbPath & ";" & SP_List_2 & "' 'WSS;RetrieveIds=Yes;') B On A.Cust_ID = B.Cust_ID;"
rsSP.Open sSQL, cnSP, adOpenStatic, adLockReadOnly 'Change cursor & lock type if inserting, updating or deleting
'The rest is to drop the results into an empty worksheet named 'Test'
For c = 0 To rsSP.Fields.Count - 1
ThisWorkbook.Sheets("Test").Cells(1, c + 1) = rsSP.Fields(c).Name
Next
ThisWorkbook.Sheets("Test").Cells(2, 1).CopyFromRecordset rsSP
rsSP.Close
cnSP.Close
End Sub