Sql server 2008 r2 使用Windows搜索服务和SQL Server 2008 R2进行全文搜索

Sql server 2008 r2 使用Windows搜索服务和SQL Server 2008 R2进行全文搜索,sql-server-2008-r2,oledb,windows-search,indexing-service,Sql Server 2008 R2,Oledb,Windows Search,Indexing Service,目前,我正在尝试从SQL Server 2008 R2实例(也在SQL Server 2012上测试)查询Windows Search服务。Windows Search作为OLE DB数据源公开,这给了我几个查询搜索索引的选项。在SQL Server中配置新的链接服务器时,Management Studio为我提供了选择Microsoft OLE DB提供程序进行搜索的选项,这意味着我应该能够从SQL Server连接到它。然而,要让它启动并运行起来是一个挑战。下面你会发现我偶然发现的错误消息

目前,我正在尝试从SQL Server 2008 R2实例(也在SQL Server 2012上测试)查询Windows Search服务。Windows Search作为OLE DB数据源公开,这给了我几个查询搜索索引的选项。在SQL Server中配置新的链接服务器时,Management Studio为我提供了选择Microsoft OLE DB提供程序进行搜索的选项,这意味着我应该能够从SQL Server连接到它。然而,要让它启动并运行起来是一个挑战。下面你会发现我偶然发现的错误消息

链接服务器“TESTSERVER”的OLE DB提供程序“Search.CollatorDSO”返回消息“命令未准备就绪”。
味精7399,第16级,状态1,第2行
链接服务器“TESTSERVER”的OLE DB提供程序“Search.CollatorDSO”报告了一个错误。未准备命令。
味精7350,16级,状态2,第2行
无法从链接服务器“TESTSERVER”的OLE DB提供程序“Search.CollatorDSO”获取列信息

事情变得更加有趣。虽然链接服务器解决方案不起作用,但我能够将查询Windows Search的代码包装在CLR函数中(使用),并在SQL Server中成功使用。但是,这不太理想,因为需要设置它(部署库、配置权限等)的步骤。我尝试了几个参数设置,但都没有成功。我还尝试启用了一些Search.CollatorDSO提供程序选项,例如允许将提供程序实例化为进程内服务器。我目前正在使用下面的设置。为了安全起见,我使用登录的当前安全上下文

  • 提供程序:
    用于搜索的Microsoft OLE DB提供程序
  • 数据源:
    (本地)
  • 提供者字符串:
    Provider=Search.CollatorDSO.1;扩展?PROPERTIES=“Application=Windows”
  • 位置:
    -
此外,我需要搜索网络驱动器,这可以使用共享Windows库来完成吗

我知道在过去几年里,越来越多的人一直在与这个问题作斗争。我想知道是否有人能把它启动并运行,或者能为我指出正确的方向

OLEDB工程 普通ADO/OLEDB组件可以使用连接字符串查询Windows Search服务:

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)".  
额外阅读
  • (2011年1月)
  • (2008年5月至2012年12月)
  • (2007年7月)
  • (2011年3月)
  • (2014年4月-建议CLR解决方案)
  • (2011年2月)
  • (-CLR解决方案)
  • ()

您在找到解决方案方面有什么进展吗?有关于它的源代码示例吗?这将搜索数据库表的内容。我正在搜索硬盘上文件的内容。
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