Полнотекстовый поиск с использованием службы поиска 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