【问题标题】:Severe error when trying to FREETEXTTABLE an indexed view with a CTE尝试使用 CTE 对索引视图进行 FREETEXTTABLE 时出现严重错误
【发布时间】:2010-11-02 20:28:27
【问题描述】:

stockView 是具有全文索引的索引视图,我收到以下错误消息。数据库在 2005 兼容模式下运行在 2008 Express 引擎上。

代码:

with stockCte (title, grade, price, weighted)
as
(
    select sv.[title]                   ,
            sv.[grade]                  ,
            sv.[price]                  ,
            (case when sv.[issue] = @issue and svs.[rank] > 30
                then svs.[rank] + 100
                else svs.[rank]
                end)                    weighted
    from stockView sv
    inner join freetexttable(stockView, (name), @term) svs
        on sv.[id] = svs.[key]
)
select * from stockCte;

错误:

Msg 0, Level 11, State 0, Line 0
A severe error occurred on the current command.  The results, if any, should be discarded.
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command.  The results, if any, should be discarded.

当我删除内部联接和加权列时,查询有效。任何想法,我都不知所措。

【问题讨论】:

  • 我什么也没看到。您有什么特别的原因将其设为 CTE 而不是仅使用内部选择?
  • 内部选择只是我开始,最终选择将包括将通过 CTE 公开的分页功能。
  • 如果您看到“当前命令发生严重错误”,这意味着服务器很可能遇到了内部运行时断言或访问冲突。它在您的 LOG 文件夹中生成了一个小型转储(名为 sqldump____.mdmp)。您可以将此转储提交给客户支持,他们可以进行调查并提供建议。

标签: sql-server tsql full-text-search common-table-expression


【解决方案1】:

它在 R2 中也没有得到修复,但有一个修补程序 - 请参阅知识库文章 #2421014。

【讨论】:

    【解决方案2】:

    错误级别 11 是找不到数据库对象; freetexttable 查询上的选择是否作为选择工作?如果是这样,完整查询是否可以作为选择(没有 cte 定义?)

    【讨论】:

    • 内部选择在没有 CTE 定义的情况下工作得很好,当 freettexttable 引用表而不是视图时,CTE 定义工作得很好。它必须是 CTE 和索引视图的组合。
    【解决方案3】:

    我不情愿地使用表变量而不是 CTE。

    declare @stockTemp table(
        title               nvarchar(100),
        grade               nvarchar(50),
        price               money,
        row                 bigint
    );
    
    insert into @stockTemp
    select sv.[title]                   ,
            sv.[grade]                  ,
            sv.[price]                  ,
            row_number() over (order by (case when sv.[issue] = @issue and svs.[rank] > 30
                                                then svs.[rank] + 100
                                                else svs.[rank]
                                                end) desc,
                                            sv.title,
                                            sv.grade desc,
                                            sv.price asc)
    from stockView sv
    inner join freetexttable(stockView, (*), @term) svs
        on sv.[id] = svs.[key]
    
    select * from @stockTemp;
    

    如果有人有更好的建议,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      相关资源
      最近更新 更多