【问题标题】:SQLServer Stored ProcedureSQL Server 存储过程
【发布时间】:2009-05-03 12:14:14
【问题描述】:

我想知道你们中是否有人有以下想法: 我有一张包含一些卡定义 [id][Company][Mode] 的表,这可以是例如是奥迪 100、福特野马等。然后我有另一个字段,它是一个包含汽车和模型的字符串,这可能是“福特野马 2.5T”,然后我需要从卡定义中找到正确的 ID。我想这样做

@CarDefintion = "Ford Mustang 2.5T"
Select top 1 CarDefinitionId 
  from dbo.CarModelDefinition 
 where CONTAINS(Model,@Cardefinition) 
   AND Contains(Company, @Cardefinition)

但由于 Model + Company 不是唯一的,我收到此错误:“不能在表或索引视图 'dbo.CarModelDefinition' 上使用 CONTAINS 或 FREETEXT 谓词,因为它不是全文索引。” 有谁知道我该如何解决这个问题?

【问题讨论】:

  • 更新了代码,我想我知道更多你想要什么

标签: sql-server tsql stored-procedures full-text-search


【解决方案1】:

使用LIKE 搜索带有通配符列值的字符串。

@CarDefintion = "Ford Mustang 2.5T"
Select top 1 CarDefinitionId 
  from dbo.CarModelDefinition 
 where @Cardefinition like '%' + model + '%'
   AND @Cardefinition like '%' + company + '%';

+ 是字符串连接运算符。

【讨论】:

  • 这是一个非常好的主意,问题是它返回一个“福特 A”,它是否应该查看单词而不是字符,所以它不会寻找 in Mustang,而只是 Mustang 这个词?
  • 当我在模型之前添加一个空格符号时它起作用了,例如从 dbo.CarModelDefinition 中选择前 1 个 CarModelDefinition.CarModelDefinitionId,其中 'Ford Mustang 2.5T' like '%' + CarModelDefinition.Model + '%' AND 'Ford Mustang 2.5T' like '%' + CarModelDefinition.Company + '%'跨度>
  • 如果每个定义都采用“公司模型”形式,则添加空格将起作用。我不确定你为什么必须添加空格(我必须查看 CarModelDefinition 中的行),所以请彻底测试一下。
  • 这是因为没有空间它只会寻找例如一个“A”,位于 Mustang 或名为“A”的模型中。通过添加空格,它将查找字符串和之前空格的组合,因此您确定您在搜索词中得到的是整个单词而不是字母 - 我希望这不是太多的胡言乱语,但非常感谢。
【解决方案2】:
@CarDefintion = "Ford Mustang 2.5T"

Select top 1 CarDefinitionId 
  from dbo.CarModelDefinition 
 where @Cardefinition LIKE Model OR @Cardefinition LIKE Company 

【讨论】:

  • 测试一下,你会发现它不适用于任何合理的数据。
【解决方案3】:

@CarDefintion 必须是字符串吗?是否可以将其设为 Model 和 Company 的数组,然后您可以在 SQL 中引用它们?

如果做不到这一点,您是否可以绝对肯定有人不会只使用“Mustang 2.5T”而不是“Ford Mustang 2.5T”?如果您可以绝对确定,那么一种方法是按空格分隔,然后对每个段进行一系列查找以尝试找到它。

【讨论】:

    【解决方案4】:
    DECLARE @CarDefintion VARCHAR(25)
            SET @CarDefintion = 'Ford Mustang 2.5T'
    
    DECLARE @Make  VARCHAR(25)
    DECLARE @Model VARCHAR(25)
    SELECT @Make  = SUBSTRING(@CarDefintion,0,CHARINDEX(' ',REVERSE(@CarDefintion)))
    SELECT @Model = LTRIM( REPLACE(@CarDefintion,@Make,'')) 
    
    --SELECT @Make,@Model
    
            SELECT TOP 1 * 
              FROM dbo.CarModelDefinition 
             WHERE Model   = @Model
               AND Company = @Make
    

    CONTAINS() 函数用于全文搜索,您很可能没有使用(因此出现错误)

    【讨论】:

    • 问题是我有字符串“Ford Mustang 2.5T”,我不知道型号和公司是什么,因此我不能使用常规的 where 语句。我需要使用表 CarDefinitions 从字符串中找到型号和公司,该表包含所有汽车型号和公司(如问题中所述)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2011-11-07
    • 2010-11-23
    • 2020-01-30
    • 2015-01-26
    相关资源
    最近更新 更多