我有一个存储过程,它返回多个记录集以在应用程序中使用。有时其中一些记录集是空的。
我想减少开销,只返回那些有 1 行或更多行的。
我的问题是 - 我怎样才能只返回那些有行的记录集?
应用程序只需要 0 个或多个记录集,然后循环遍历每个记录集,然后将它们打印出来。
我知道我可以在应用程序代码中跳过它们,但我试图阻止它们被返回,如果它们为空的话。
程序很简单:
CREATE PROCEDURE bfsp_PROC_NM
AS
BEGIN
SELECT * FROM TABLE_1
SELECT * FROM TABLE_2
SELECT * FROM TABLE_3
RETURN
END
GO
在实际过程中,有些查询很昂贵,所以我不想测试查询,如果它返回一行或更多,请再次执行......因为它太昂贵了。
这是一个可怕的想法。应用程序如何知道它正在处理什么结果集?存储过程应该有一组固定的结果集形状。
话虽如此,为此将结果加载到临时表中,然后从那些非空的表中选择。
例如
我喜欢我的代码是可预测的,如果你总是返回 X 组数据,你可以在你的应用程序中编程,你总是知道会发生什么。所以也许过滤掉集合不是最好的主意。
但是,一个选项可能是检查您正在执行的表/选择是否返回行,如果它们返回集合,则跳过它。这显然有一些开销,因为您必须为要返回的每个结果集指定它。
此代码中的示例:
假设所有三个表中的数据具有相似的结构,您可以将数据插入到一个临时表中,然后让您的过程返回一个包含所有可用行的结果集:
返回的结果集可能仍然是空的——如果三个源表都没有要返回的数据——但您可以从元数据中确定这一点。
如果源表不具有相似的结构,那么我必须同意前面的回复——返回可变数量的结果集是个坏主意。 如果源表不同并且您的过程返回的结果集少于三个,那么您需要检查每个结果集的字段列表,以便在处理数据之前找出丢失的内容。