当前我正在尝试从SQL Server 2008 R2实例查询Windows搜索服务(也在SQL Server 2012上测试)。Windows搜索正在作为OLE DB DataSource公开,为我提供了几种查询搜索索引的选项。在SQL Server中配置新的链接服务器时,Management Studio为我提供了选择Microsoft Ole DB提供商进行搜索的选项,这意味着我应该能够从SQL Server连接到它。事实证明,将其启动并运行是一个挑战。下面您会发现我偶然发现的错误消息。
ole db提供商" search.collatordso"链接服务器" testserver"返回消息"未准备好"。
MSG 7399,第16级,状态1,第2行
OLE DB提供商" search.collatordso"链接服务器" testserver"报告了一个错误。命令没有准备好。
MSG 7350,16级,状态2,第2行
无法从Ole DB提供商" search.collatordso"获取列信息。
事情变得更加有趣。尽管链接的服务器解决方案无法正常工作,但我能够包装在CLR函数中查询Windows搜索的代码(使用MSDN:以编程方式查询索引),并在SQL Server中使用成功使用。但是,由于设置它所需的步骤(部署库,配置权限等),这是不可取的。我尝试了几个参数设置,没有任何运气。我还尝试过启用一些search.collatordso提供商选项,例如允许提供商将提供商实例化为过程中的服务器。我目前正在使用以下设置。为了安全起见,我正在使用登录的当前安全上下文。
-
提供者:
Microsoft OLE DB Provider for Search
-
数据来源:
(local)
-
提供者字符串:
Provider=Search.CollatorDSO.1;EXTENDED?PROPERTIES="Application=Windows"
-
位置:
-
此外,我需要搜索网络驱动器,可以使用共享Windows库进行操作吗?
我知道,在过去的几年中,越来越多的人一直在努力解决这个问题。我想知道是否有人能够启动并运行,或者可以将我指向正确的方向。
OLEDB Works
普通的ADO/OLEDB组件可以使用连接字符串查询Windows搜索服务:
provider=Search.CollatorDSO.1;EXTENDED PROPERTIES="Application=Windows"
和一个示例查询:
SELECT TOP 100000 "System.ItemName",
"System.ItemNameDisplay",
"System.ItemType",
"System.ItemTypeText",
"System.Search.EntryID",
"System.Search.GatherTime",
"System.Search.HitCount",
"System.Search.Store",
"System.ItemUrl",
"System.Filename",
"System.FileExtension",
"System.ItemFolderPathDisplay",
"System.ItemPathDisplay",
"System.DateModified",
"System.ContentType",
"System.ApplicationName",
"System.KindText",
"System.ParsingName",
"System.SFGAOFlags",
"System.Size",
"System.ThumbnailCacheId"
FROM "SystemIndex"
WHERE CONTAINS(*,'"Contoso*"',1033)
您可以通过尝试运行:
直接在SQL Server Management Studio中的SQL Server上尝试查询SELECT *
FROM OPENROWSET(
'Search.CollatorDSO',
'Application=Windows',
'SELECT TOP 100 "System.ItemName", "System.FileName" FROM SystemIndex');
给出错误:
OLE DB provider "Search.CollatorDSO" for linked server "(null)" returned message "Command was not prepared.".
Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "Search.CollatorDSO" for linked server "(null)" reported an error. Command was not prepared.
Msg 7350, Level 16, State 2, Line 1
Cannot get the column information from OLE DB provider "Search.CollatorDSO" for linked server "(null)".
奖金阅读
- 使用链接服务器从SQL Server连接到Windows搜索(2011年1月)
- 与SQL Server链接(2008年5月 - 2012年12月)
- 尝试从SQL Server访问Windows搜索:applion (2007年7月)
- 从SQL Server 2008 调用Windows搜索(2011年3月)
- ole db提供商" search.collatordso"返回"命令"没有准备好。(2014年4月 - 建议CLR解决方法)
- 链接到Windows搜索的服务器(2011年2月)
- MSDN博客:在使用search.collatordso提供商(2009年8月 - 建议clr解决方法)
- Vista Search (2007年2月)
Have a look at this code..It may help
USE [YourDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create PROC [dbo].[SearchAllTables]
@SearchStr nvarchar(100)
AS
BEGIN
DECLARE @dml nvarchar(max) = N''
IF OBJECT_ID('tempdb.dbo.#Results') IS NOT NULL DROP TABLE dbo.#Results
CREATE TABLE dbo.#Results
([tablename] nvarchar(100),
[ColumnName] nvarchar(100),
[Value] nvarchar(max))
SELECT @dml += ' SELECT ''' + s.name + '.' + t.name + ''' AS [tablename], ''' +
c.name + ''' AS [ColumnName], CAST(' + QUOTENAME(c.name) +
' AS nvarchar(max)) AS [Value] FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) +
' (NOLOCK) WHERE CAST(' + QUOTENAME(c.name) + ' AS nvarchar(max)) LIKE ' + '''%' + @SearchStr + '%'''
FROM sys.schemas s JOIN sys.tables t ON s.schema_id = t.schema_id
JOIN sys.columns c ON t.object_id = c.object_id
JOIN sys.types ty ON c.system_type_id = ty.system_type_id AND c .user_type_id = ty .user_type_id
WHERE t.is_ms_shipped = 0 AND ty.name NOT IN ('timestamp', 'image', 'sql_variant')
INSERT dbo.#Results
EXEC sp_executesql @dml
SELECT *
FROM dbo.#Results
END