2

空の結果セットですぐに返されるのではなく、結果が出るまでクエリを待機させることは可能ですか?例えば:

SELECT Column1 FROM Table1

が空の場合Table1、クエリは空の結果セットで返されます。ただし、戻らないようにしたいのですが、少なくとも1つの行が使用可能になるまで、できれば何らかのタイムアウトで待機します。可能であれば、ServiceBrokerを方程式に含めずにこれを実行したいと思います。

明確化:

サーバーでCLRが有効になっていますが、呼び出しはSQLAPI ++/ODBCを介してプラットフォームに依存しないC++プログラムから発信されています。したがって、C#/。NETのトリックは不可能です。目標は、ストアード・プロシージャーを呼び出し、タイムアウトを指定し、データが使用可能になる(およびストアード・プロシージャーによって返される)か、指定されたタイムアウトが期限切れになるまで戻らないことです。

例えば:

EXEC GetData @Timeout=2000 -- Wait for upto 5000 milliseconds for a result set to be 
                           -- available
4

1 に答える 1

0

醜いが効果的。実行されるクエリが低コストである限り、たとえば空のテーブルに行が表示されるのを待つ限り、これはあまりリソー​​スの豚ではありません。

declare @Timeout as Int = 5000 -- Milliseconds.

-- Start and end times.
declare @Now as DateTime = GetDate()
declare @TimeoutExpiration as DateTime = DateAdd( ms, @Timeout, @Now )

-- Set the delay interval to the smaller of  @Timeout / 10   or   1 second.
declare @DelayInterval as Time = DateAdd( ms, @Timeout / 10, 0 )
if @DelayInterval > '00:00:01.000'
  set @DelayInterval = '00:00:01.000'
declare @WaitForDelay as VarChar(12) = Cast( @DelayInterval as VarChar(12) )  -- WaitFor insists on a truncated string for the delay.

select @Timeout as 'Timeout (ms)', @Now as 'Now', @TimeoutExpiration as 'TimeoutExpiration', @DelayInterval as 'DelayInterval'

declare @Result as Table ( Foo Int ) -- Modify to match the schema of your expected results.

-- Execute the query in a loop until either a result is returned or the timeout expires.
declare @RowCount as Int = 0
declare @Iterations as Int = 0
while @TimeoutExpiration >= GetDate() and @RowCount = 0
  begin
  -- Randomly decide to insert a row into the results.  (Replace with your query.)
  insert into @Result
    select 42 as Foo
      where Rand() > 0.8
  -- Handle the query result.
  set @RowCount = @@RowCount
  if @RowCount = 0
    waitfor delay @WaitForDelay
  set @Iterations = @Iterations + 1
  end

-- Return the result.
select @Iterations as 'Iterations' -- Just for demonstration purposes.
select *
  from @Result
于 2012-11-08T16:41:01.137 に答える