Полнотекстовый поиск с использованием службы поиска Windows и SQL Server 2008 R2

В настоящее время я пытаюсь запросить службу поиска Windows с экземпляра SQL Server 2008 R2 (также протестирован на SQL Server 2012). Поиск в Windows отображается как источник данных OLE DB, предоставляя мне несколько вариантов запроса индекса поиска. При настройке нового Linked Server в 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" для связанного сервера "TESTSERVER" .

Все становится еще интереснее. Хотя решение Linked Server не работает, я могу обернуть код, который запрашивает поиск Windows в функции CLR (используя 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 в SQL Server Management Studio, пытаясь запустить:

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)".  

Чтение бонусов

Ответы

Ответ 1

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