Как использовать 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
Другие вопросы по тегам