【发布时间】:2011-03-18 06:20:14
【问题描述】:
CREATE PROCEDURE p_processDataFor @accountId
BEGIN
for each item in
(select * from Accounts where accountId = @accountId and isProcessed = 0)
BEGIN
CASE current row
WHEN has x Condition THEN
exec p_x <Pass all data of current row>
WHEN has y Condition THEN
exec p_y <Pass all data of current row>
WHEN has z Condition THEN
exec p_z <Pass all data of current row>
END
END
END
【问题讨论】:
-
您可能必须内联
p_x、p_y和p_z的内容。如果没有看到它们的内容,很难知道在这种情况下是否可能。了解p_x等是否在您系统的其他地方使用也会很有用。 -
p_x 等包含基于少数条件将数据插入其他表的代码。假设 p_x 等不会在其他地方使用。
-
一行是否会匹配多个 x、y 和/或 z 条件,并且是您实现的超出预期的行为(如果 x 条件匹配,则永远不会考虑 y 或 z) .此外,这个游标从不将 isProcessed 设置为另一个值这一事实是否是一个遗漏,还是在其他地方处理过(或者是无关紧要的)?
-
如果每个
p_x只是一个单独的插入,那么绝对可以将它们内联并消除光标。 -
p_x 在不同的表中有多个插入,并且必须在后续表中再次插入 SCOPE_IDENTITY()。它们具有逻辑参照完整性(但未在表上创建外键)。是的,你是对的,它设置了 isProcessed。我完全错过了。
标签: sql-server tsql sql-server-2008 cursor