Как использовать CONTAINS со встроенными запросами в SQL Server 2008?
У меня есть этот SQL-запрос, где я пытаюсь использовать CONTAINS для поиска в поле заголовка.
Но я получаю эту ошибку.
"Невозможно использовать предикат CONTAINS или FREETEXT для столбца" Заголовок ", так как он не полнотекстовый".
Таблица Titles была проиндексирована, и CONTAINS отлично работает с простым поиском.
Кто-нибудь знает, что я делаю не так? Разве запросы CONTAIN не поддерживаются встроенными запросами?
Этот запрос выполняется в SQL Server 2008.
SELECT pi.PublisherGUID, pi.Publisher, pi.TitleGUID, pi.Title,
pi.YearsPublished, pi.FrontImage, pi.IssueGUID, pi.IssueNumber,
pi.IssueVariation, pi.IssueNotes, pi.CoverDate, pi.IsForSale
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY PublicIssues.Title,PublicIssues.IssueNumber) AS RowNum,
PublicIssues.PublisherGUID, PublicIssues.Publisher,
PublicIssues.TitleGUID, PublicIssues.Title,
PublicIssues.YearsPublished, PublicIssues.FrontImage,
PublicIssues.IssueGUID, PublicIssues.IssueNumber,
PublicIssues.IssueVariation, PublicIssues.IssueNotes,
PublicIssues.CoverDate, PublicIssues.IsForSale
FROM (SELECT dbo.tblTitles.PublisherGUID, dbo.tblPublishers.Name AS Publisher,
dbo.tblTitles.TitleGUID, dbo.tblTitles.Title,
dbo.tblTitles.YearsPublished, dbo.tblIssues.IssueGUID,
dbo.tblIssues.IssueNumber, dbo.tblIssues.IssueVariation,
dbo.tblIssues.IssueNotes, dbo.tblIssues.CoverDate,
dbo.tblStockIssueImages.FrontImage,
ci_owner.IssueForSale(dbo.tblIssues.IssueGUID) AS IsForSale
FROM dbo.tblStockIssueImages RIGHT OUTER JOIN
dbo.tblIssues ON
dbo.tblStockIssueImages.StockIssueImageGUID = dbo.tblIssues.StockIssueImageGUID
LEFT OUTER JOIN
dbo.tblTitles INNER JOIN
dbo.tblPublishers ON dbo.tblTitles.PublisherGUID = dbo.tblPublishers.PublisherGUID
ON dbo.tblIssues.TitleGUID = dbo.tblTitles.TitleGUID
)
AS PublicIssues
WHERE 1=1 AND CONTAINS(Title,@xTitle)
) AS pi
WHERE RowNum BETWEEN (@xPageNum - 1) * @xPageSize + 1 AND
@xPageNum * @xPageSize ORDER BY pi.Title
1 ответ
Действительно, в контексте PublicIssues, заголовок не полнотекстовый индексированный.
Индексируется в таблице tblTitles.
Я думаю, что может быть возможно переместить предикат CONTAINS внутри выражения, которое определяет PublicIssues. Что-то вроде следующего. Однако я подозреваю (с намеком на 1=1), что идея состоит в том, чтобы иметь различные другие критерии, и может быть нереально иметь их все "внутри". Поскольку это [по-видимому] динамический SQL, может быть целесообразным создать запрос, разместив критерии поиска в одном из двух мест, в зависимости от ситуации.
FROM (SELECT dbo.tblTitles.PublisherGUID, dbo.tblPublishers.Name AS Publisher,
dbo.tblTitles.TitleGUID, dbo.tblTitles.Title,
dbo.tblTitles.YearsPublished, dbo.tblIssues.IssueGUID,
dbo.tblIssues.IssueNumber, dbo.tblIssues.IssueVariation,
dbo.tblIssues.IssueNotes, dbo.tblIssues.CoverDate,
dbo.tblStockIssueImages.FrontImage,
ci_owner.IssueForSale(dbo.tblIssues.IssueGUID) AS IsForSale
FROM dbo.tblStockIssueImages RIGHT OUTER JOIN
dbo.tblIssues ON
dbo.tblStockIssueImages.StockIssueImageGUID = dbo.tblIssues.StockIssueImageGUID
LEFT OUTER JOIN
dbo.tblTitles INNER JOIN
dbo.tblPublishers ON dbo.tblTitles.PublisherGUID = dbo.tblPublishers.PublisherGUID
ON dbo.tblIssues.TitleGUID = dbo.tblTitles.TitleGUID
WHERE CONTAINS(Title,@xTitle) --- this lined moved
)
AS PublicIssues