首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Windows search Service和SQL Server2008 R2进行全文搜索

使用Windows search Service和SQL Server2008 R2进行全文搜索
EN

Stack Overflow用户
提问于 2014-03-11 00:51:22
回答 1查看 3.4K关注 0票数 17

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

链接服务器"TESTSERVER“的

OLE DB访问接口"Search.CollatorDSO”返回消息“未准备命令。”

消息7399,第16级,状态1,第2行

链接服务器"TESTSERVER“的OLE DB访问接口"Search.CollatorDSO”报告错误。命令未准备好。

Msg 7350,Level 16,State 2,Line 2

无法从链接服务器"TESTSERVER“的OLE DB访问接口"Search.CollatorDSO”获取列信息。

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

来源:

  • Provider: Microsoft OLE DB Provider for Search
  • Data (local)
  • Provider string: Provider=Search.CollatorDSO.1;EXTENDED?PROPERTIES="Application=Windows"
  • Location: -

此外,我还需要搜索网络驱动器,是否可以使用共享Windows库来实现?

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

OLEDB工作

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

代码语言:javascript
复制
provider=Search.CollatorDSO.1;EXTENDED PROPERTIES="Application=Windows"

和一个示例查询:

代码语言:javascript
复制
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上执行查询,方法是尝试运行以下命令:

代码语言:javascript
复制
SELECT *
FROM OPENROWSET(
        'Search.CollatorDSO', 
        'Application=Windows', 
        'SELECT TOP 100 "System.ItemName", "System.FileName" FROM SystemIndex');

这给出了错误:

代码语言:javascript
复制
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)".  

奖励阅读

EN

回答 1

Stack Overflow用户

发布于 2017-05-12 21:22:54

代码语言:javascript
复制
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
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22306325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档