在重写使用光标的查询时需要帮助
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.ID
和t2.ID
之间存在外键关系。
【问题讨论】:
udf_TableFunction 返回什么?问题是它返回单行。它是否可以适应返回所有行(比如如果 ID 为 NULL),在这种情况下你可以加入它... 它返回一个行集合。如果传入null,则无法更改为返回所有行,但永远不会传递null。 需要看udf_TableFunction
的内容
如果 udf_tablefunction 所做的只是从表中返回 ID、名称、地址、国家,为什么不简单地引用基础表呢?我同意 OMG Ponies,在不知道函数在做什么的情况下推荐任何东西有点困难......
【参考方案1】:
使用cross apply
将Table1.ID
传递给udf_TableFunction
。
这是一个伪代码,说明您将如何去做。 (我现在无法访问 SSMS,所以无法测试它)
insert #TempTable(...)
select ...
from table1 t1 cross apply [DBO].udf_TableFunction(t1.ID) t2
where ...
【讨论】:
最终将表函数分解为原始查询并使用交叉应用。以上是关于在重写使用光标的查询时需要帮助的主要内容,如果未能解决你的问题,请参考以下文章