【问题标题】:Why can't ISNULL be called inside a CONTAINS statement?为什么不能在 CONTAINS 语句中调用 ISNULL?
【发布时间】:2010-09-23 18:46:33
【问题描述】:

假设我有这个 SQL 查询:

declare @input varchar(20)
select *
from myTable
where CONTAINS (myColumn, ISNULL(@input, 'replacement text'))

如果我尝试执行此操作,我会收到一条错误消息,提示“'ISNULL' 附近的语法不正确”。我知道这是 ISNULL 的正确语法。 ISNULL 不能在 CONTAINS 语句中调用有什么原因吗?

【问题讨论】:

    标签: sql tsql


    【解决方案1】:

    试试这个:

    declare @input varchar(20)
    SET @input=ISNULL(@input, 'replacement text')
    select *
    from myTable
    where CONTAINS (myColumn, @input)
    

    当您尝试将表达式放入存储过程调用时,也是同样的问题:

    EXEC YourProcedure ISNULL(@input, 'replacement text') --will fail too
    

    CONTAIN 需要一个字符串文字,参见 CONTAINS (Transact-SQL)

    【讨论】:

      【解决方案2】:

      这里需要的是字符串文字,而不是表达式。

      更新

      The code for the procedure is:

      CREATE PROCEDURE freetext_rank_proc
             @select_list             nvarchar(1000),
             @from_table              nvarchar(517),
             @freetext_column         sysname,
             @freetext_search         nvarchar(1000),
             @additional_predicates  nvarchar(500)      = '',
             @order_by_list           nvarchar(500)      = ''
      AS 
      BEGIN
         DECLARE @table_id              integer,
                 @unique_key_col_name   sysname,
                 @add_pred_var          nvarchar(510),
                 @order_by_var          nvarchar(510) 
      
         -- Get the name of the unique key column for this table.
         SET @table_id = Object_Id(@from_table)
         SET @unique_key_col_name = 
         Col_Name( @table_id, 
         ObjectProperty(@table_id, 'TableFullTextKeyColumn') )     
      
         -- If there is an additional_predicate, put AND() around it.
         IF @additional_predicates <> ''
            SET @add_pred_var = 'AND (' + @additional_predicates + ')'
         ELSE
            SET @add_pred_var = ''
      
         -- Insert ORDER BY, if needed.
         IF @order_by_list <> ''
            SET @order_by_var = 'ORDER BY ' + @order_by_var
         ELSE
            SET @order_by_var = ''
      
         -- Execute the SELECT statement.
         EXECUTE (   'SELECT ' 
                   + @select_list
                   + ' FROM '
                   + @from_table
                   + ' AS FT_TBL, FreetextTable('
                   + @from_table
                   + ','
                   + @freetext_column
                   + ','''
                   + @freetext_search
                   + ''') AS KEY_TBL '
                   + 'WHERE FT_TBL.'
                   + @unique_key_col_name
                   + ' = KEY_TBL.[KEY] ' 
                   + @add_pred_var
                   + ' '
                   + @order_by_var
                 )
      END
      

      【讨论】:

        【解决方案3】:

        因为syntax of the language 不允许:

        CONTAINS
           ( { column_name | ( column_list ) | * } 
             ,'<contains_search_condition>'     
           [ , LANGUAGE language_term ]
           ) 
        
        <contains_search_condition> ::= 
            { <simple_term> 
            | <prefix_term> 
            | <generation_term> 
            | <proximity_term> 
            | <weighted_term> 
            } 
            | { ( <contains_search_condition> ) 
            [ { <AND> | <AND NOT> | <OR> } ] 
            <contains_search_condition> [ ...n ] 
            } 
        

        如您所见,语法需要如上所述的 contains_search_condition,在单引号之间,而不是表达式。

        【讨论】:

          【解决方案4】:

          我的猜测是因为 contains 用于全文搜索而不是常规 t-SQl,因此常规 t-sql 函数在其中不起作用。 @KM 已经发布了我想尝试的内容。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-05-20
            • 2020-11-01
            • 2015-03-17
            • 2014-02-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-15
            相关资源
            最近更新 更多