Select上的独特联盟。 ntext数据类型的错误

时间:2012-01-13 12:03:21

标签: sql sql-server sql-server-2008-r2

我在SQL上没用,但我发现自己必须为非常简单的关键短语搜索编写存储过程。

我正在尝试对名称进行简单选择 - 使用像%keyword% - 然后在Description -same关键字上另一个选择 - 并加入(联合)2个选择。

然而,我收到错误:

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

我尝试使用UNION ALL,但在某些情况下返回了重复的行(取决于关键字/词组)。

我也尝试使用临时表并选择不同的,但这就是我真的很困惑的地方。

规则:

  • 我无法更改数据类型
  • 我需要'名称'上的select行位于'Description'上选择的行上方
  • 我只能使用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+'%')

任何帮助摆脱不同行的表格都会非常感激。另外,向我解释一下Layman会很棒。 :)

3 个答案:

答案 0 :(得分:7)

使用类似'cast(描述为nvarchar(2000))作为描述'而不是ntext字段名称。

答案 1 :(得分:5)

这个答案适用于像我这样没有重复行问题的其他人。

UNION ALL可能就是你想要的。

请参阅documentation for the UNION operator

答案 2 :(得分:4)

来自评论。看来这就是你需要的。

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  

您可能需要考虑使用Full Text Search,因为使用前导通配符的搜索无法使用索引,并且始终需要扫描所有行。