【问题标题】:Removing empty tables from TSQL sproc output data sets?从 TSQL sproc 输出数据集中删除空表?
【发布时间】:2011-07-08 13:34:51
【问题描述】:

我有一个 TSQL 存储过程,它执行三个循环以查找相关数据。如果第一个循环没有呈现结果,那么第二个通常会呈现。我附加了另一个具有多个值的表,我以后可以使用它们。

所以我最多只能从存储过程的数据集中返回两个表。

问题是,如果第一个循环是空白的,那么我的数据集中会有三个数据表。

在我的 C# 代码中,我可以删除这个空表,但不希望它从存储过程中返回。

有没有办法从存储过程中删除空表,给定以下条件:

EXEC (@sqlTop + @sqlBody + @sqlBottom)
SET @NumberOfResultsReturned = @@ROWCOUNT;
.
.
.
IF @NumberOfResultsReturned = 0
    BEGIN
        SET @searchLoopCount = @searchLoopCount + 1
    END
ELSE
    BEGIN
        -- we have data, so no need to run again
        BREAK
    END

过程如下:在第一个循环中可能没有结果。因此,行数将为零,因为 EXEC 执行动态创建的 SQL 查询。那是一张桌子。

在下一次迭代中,返回结果,在数据集中输出两个数据表,最后添加我的第三个。

我不想做一个 COUNT(*) 然后如果 > 0 然后执行查询,因为我想最小化查询。

谢谢。

【问题讨论】:

  • 您能否提供更多关于如何选择结果的信息?您是否尝试过使用临时表或表变量?我想如果您首先选择该表变量,然后仅从该表中选择(并返回结果)如果它不为空,那么您应该完全控制返回的结果集的数量。

标签: tsql stored-procedures c#-4.0


【解决方案1】:

您可以将 SP 的结果放入表变量中,然后检查表变量中是否包含任何数据。

类似这样的事情,带有一个名为GetData 的 SP,它返回一个整数列。

declare @T table(ID int)
declare @SQL varchar(25)

-- Create dynamic SQL
set @SQL = 'select 1'

-- Insert result from @SQL to @T
insert into @T
exec (@SQL)

-- Check for data
if not exists(select * from @T)
begin
  -- No data continue loop
  set @searchLoopCount = @searchLoopCount + 1
end
else
begin
  -- Have data so wee need to query the data
  select *
  from @T

  -- Terminate loop
  break
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 2019-12-19
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多