在重写使用光标的查询时需要帮助

Posted

技术标签:

【中文标题】在重写使用光标的查询时需要帮助【英文标题】:Need help on rewriting a query that Uses a Cursor 【发布时间】:2010-01-30 00:26:33 【问题描述】:

我的查询如下所示:

DECLARE Match_Cursor CURSOR
FOR
   SELECT ID,UserKey,TypeCode
   FROM [DB1].Table1 as t1
OPEN Match_Cursor

FETCH NEXT FROM Match_cursor INTO @ID,@UserKey,@TypeCode;
   WHILE (@@FETCH_STATUS <> -1)
   BEGIN
      INSERT INTO #TempTable
          SELECT  t2.Name, t2.Address, t2.Country, @UserKey, @TypeCode
          FROM  [DB1].[DBO].udf_TableFunction(@ID) as t2
          where @typeCode = 142 AND t2.Country = 'US'
FETCH NEXT FROM Match_cursor INTO @ID,@UserKey,@TypeCode;
   END

SELECT * FROM #TempTable

有没有人建议使用连接重写它?假设t1.IDt2.ID 之间存在外键关系。

【问题讨论】:

udf_TableFunction 返回什么?问题是它返回单行。它是否可以适应返回所有行(比如如果 ID 为 NULL),在这种情况下你可以加入它... 它返回一个行集合。如果传入null,则无法更改为返回所有行,但永远不会传递null。 需要看udf_TableFunction的内容 如果 udf_tablefunction 所做的只是从表中返回 ID、名称、地址、国家,为什么不简单地引用基础表呢?我同意 OMG Ponies,在不知道函数在做什么的情况下推荐任何东西有点困难...... 【参考方案1】:

使用cross applyTable1.ID 传递给udf_TableFunction

这是一个伪代码,说明您将如何去做。 (我现在无法访问 SSMS,所以无法测试它)

insert #TempTable(...)
select ...
from  table1 t1 cross apply [DBO].udf_TableFunction(t1.ID) t2
where ...

【讨论】:

最终将表函数分解为原始查询并使用交叉应用。

以上是关于在重写使用光标的查询时需要帮助的主要内容,如果未能解决你的问题,请参考以下文章

SQL 帮助 - 重写查询

在重写此查询时需要指导

需要帮助编写查询(重组表)

在提高 SQL Query 的查询性能方面需要帮助

过程中的光标并调用过程

需要帮助重新编写一些最初使用名为 Squeel 的 gem 编写的 Rails DB 查询,具有有效的 SQL