【问题标题】:SQL Server 2008 CTE And CONTAINSTABLE Statement - Why the error?SQL Server 2008 CTE 和 CONTAINSTABLE 语句 - 为什么会出错?
【发布时间】:2010-12-21 05:25:22
【问题描述】:

我正在测试将我们的数据库从 SQL Server 2005 迁移到 2008。我们使用 CTE 进行分页。

当使用全文 CONTAINSTABLE 时,CTE 不会运行并产生错误。

这是我的非工作代码-

WITH results  AS (  
 SELECT ROW_NUMBER() over (ORDER BY  GBU.CreateDate DESC ) as rowNum,             
 GBU.UserID,  
 NULL AS DistanceInMiles   
 FROM User GBU WITH (NOLOCK)  
 WHERE 1=1   
 AND GBU.CountryCode IN (SELECT [Value] FROM fn_Split('USA',','))   
 AND GBU.UserID IN (SELECT [KEY] FROM CONTAINSTABLE(VW_GBU_Search, *, 'COMPASS'))  
 )
SELECT * from results  
WHERE rowNum BETWEEN 0 and 25  

如果我注释掉 CONTAINSTABLE 行,语句就会执行。如果我只运行 SELECT 语句(而不是 WITH),则语句执行得很好。

我得到的无用错误是:

消息 0,级别 11,状态 0,行 0 A 当前发生严重错误 命令。结果,如果有的话,应该 被丢弃。消息 0,级别 20,状态 0, Line 0 发生严重错误 当前命令。结果,如果 任何,都应该丢弃。

有什么建议吗?

【问题讨论】:

  • 您需要突出显示代码行(如您的 SQL 语句),然后按编辑器工具栏上的“代码”按钮 (101 010)(或按键盘上的 Ctrl-K)以正确格式化和语法高亮那些代码部分!

标签: sql sql-server sql-server-2008 full-text-search containstable


【解决方案1】:

似乎是一个错误。见http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=426981

听起来修复应该在下一个 MSSQL SP 中。

【讨论】:

    【解决方案2】:

    假设其他答案是正确的,并且根本问题是一个错误,因为您没有从 CONTAINSTABLE 引用 RANK,也许类似以下的查询将是一种解决方法,其中“ID”是 ID 列VW_GBU_Search(未经测试)?

    ;WITH results AS (  
     SELECT ROW_NUMBER() OVER (ORDER BY  GBU.CreateDate DESC ) AS rowNum,                     
       GBU.UserID,  
       NULL AS DistanceInMiles   
       FROM User GBU WITH (NOLOCK)  
       WHERE 1=1   
       AND GBU.CountryCode IN (SELECT [Value] FROM fn_Split('USA',','))   
       AND GBU.UserID IN (SELECT ID FROM VW_GBU_Search WHERE CONTAINS(*, 'COMPASS')) 
    )
    SELECT * FROM results  
      WHERE rowNum BETWEEN 0 AND 25
    

    另外,为什么要使用“1=1”子句?你能消除它吗?

    【讨论】:

      【解决方案3】:

      我在这个问题上撞了好几个小时。这是一个解决方法:

      ASSUME: A table in database called 
              Items ( ItemId int PK, Content varchar(MAX) ), 
              which has a fulltext index already applied.
      
      GO
      CREATE FUNCTION udf_SearchItemsTable(@FreeText)
      RETURNS @SearchHits
      TABLE(
         Relevance int,
         ItemId int,
         Content varchar(MAX)
      )
      AS 
      BEGIN
         INSERT @SearchHits
         SELECT Results.[Rank] AS Relevance
               ,Items.ItemId AS ItemId
               ,Items.Content AS Content
         FROM SearchableItems AS Items INNER JOIN 
               CONTAINSTABLE(SearchableItems, *, @FreeText) AS Results
                 Results.[Key] = Items.Id
         RETURN
      END
      GO
      ...
      GO
      CREATE FUNCTION udf_SearchItems( @SearchText, @StartRowNum, @MaxRows)
      RETURNS @SortedItems
      TABLE (
         ItemId int,
         Content varchar(MAX)
      )
      AS
      BEGIN
          WITH Matches AS
          (
               SELECT 
                  ROW_NUMBER() OVER (ORDER BY Hits.Relevance DESC) AS RowNum
                 ,Hits.*
              FROM ( udf_SearchItemsTable(@SearchText) ) AS Hits
          )
          SELECT
              ItemId, Content
          FROM
              Matches
          WHERE
              Matches.RowNum BETWEEN @StartRowNum 
          AND @StartRowNum + @MaxRows
          ;
          RETURN
      END
      GO   
      
      
      select * from udf_SearchItems('some free text stuff', 10, 20)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多