Отличный союз на Селект.Ошибки в типе данных ntext - PullRequest
8 голосов
/ 13 января 2012

Я довольно бесполезен в SQL, но мне приходится писать хранимую процедуру для очень простого поиска по ключевой фразе.

Я пытаюсь сделать простой выбор по имени - используя как% ключевое слово% - затем еще один выбор по описанию - то же самое ключевое слово - и объединение (объединение) 2 выбора.

Однако я получаю сообщение об ошибке:

The ntext data type cannot be selected as DISTINCT because it is not comparable.

Я пытался использовать UNION ALL, но в некоторых случаях он возвращал повторяющиеся строки (в зависимости от ключевого слова / фразы).

Я также пытался использовать временные таблицы и выбирать разные, но вот тут я действительно запутался.

Правила:

  • Я не могу изменить тип данных
  • Мне нужно, чтобы строки из выбора в «Имя» были выше строк из выбора в «Описание»
  • Я могу использовать только 1 хранимую процедуру и не могу изменить адаптер данных, так как подключаю его к системе, которую я не могу контролировать.

Дополнительная информация:

Столбцы таблицы (важными 2, с которыми я работаю, являются Имя и Описание):

ProductId   int
Name    varchar(255)
Introduction    varchar(255)
Description ntext
Material    ntext
Colour  varchar(255)
Active  bit
Dimensions  varchar(255)
Photo   varchar(255)
Price   decimal(10, 2)
DisplayOrder    int
ProductReference    varchar(255)
CategoryId  int
FriendlyURL varchar(1000)

SQL:

(SELECT        Products.ProductId, Name, Introduction, Description, Active, 
            Material, Colour, Dimensions, Photo, Price, DisplayOrder, FriendlyURL,
            ProductReference, Categories_Products_Lookup.CategoryId
FROM            Products INNER JOIN
                Categories_Products_Lookup ON 
                Products.ProductId = Categories_Products_Lookup.ProductId
WHERE           Active = 1 AND tProduct.Name like '%'+@Keyword+'%')
UNION
(SELECT        Products.ProductId, Name, Introduction, Description, Active, 
            Material, Colour, Dimensions, Photo, Price, DisplayOrder, FriendlyURL,
            ProductReference, Categories_Products_Lookup.CategoryId
FROM            ProductsINNER JOIN
                Categories_Products_Lookup ON 
                Products.ProductId = Categories_Products_Lookup.ProductId
WHERE           Active = 1 AND Products.Description like '%'+@Keyword+'%')

Любая помощь в получении таблицы с отдельными строками будет очень признательна. Кроме того, было бы здорово объяснить мне, как дилетанту. :)

Ответы [ 3 ]

7 голосов
/ 13 января 2012

Используйте что-то вроде «cast (Description as nvarchar (2000)) как Description» вместо имен полей ntext.

5 голосов
/ 21 октября 2014

Этот ответ для таких, как я, у которых не будет проблем с дублирующимися строками.

UNION ALL это, вероятно, то, что вы хотите.

См. Документацию для оператора UNION .

4 голосов
/ 13 января 2012

из комментариев. Кажется, это то, что вам нужно.

SELECT Products.ProductId,
       Name,
       Introduction,
       Description,
       Active,
       Material,
       Colour,
       Dimensions,
       Photo,
       Price,
       DisplayOrder,
       FriendlyURL,
       ProductReference,
       Categories_Products_Lookup.CategoryId
FROM   Products
       INNER JOIN Categories_Products_Lookup
         ON Products.ProductId = Categories_Products_Lookup.ProductId
WHERE  Active = 1
       AND ( Products.Description like '%' + @Keyword + '%'
              or Products.Name like '%' + @Keyword + '%' )
ORDER  BY CASE
            WHEN Products.Name like '%' + @Keyword + '%' THEN 0
            ELSE 1
          END  

Возможно, вы захотите использовать для этого Полнотекстовый поиск , поскольку при поиске с использованием подстановочных знаков не может использоваться индекс, и всегда нужно сканировать все строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...