0

SQL Server 2008 R2 を使用しています。私は次のようなストアドプロシージャを持っています:

ALTER PROCEDURE [dbo].[GetZone]
    -- Add the parameters for the stored procedure here
@TheInsee int
AS
BEGIN
declare @Zone int

declare @CountA int
declare @CountB int
declare @CountC int
declare @CountD int
declare @CountN int
declare @CountP int
declare @CountN1 int
declare @CountN2 int
declare @CountN3 int
declare @CountN4 int
declare @CountN5 int
declare @CountN6 int

SELECT @CountA = COUNT(*) FROM LS_CLIENT_INSEE_A WHERE NO_INSEE = @TheInsee
SELECT @CountB = COUNT(*) FROM LS_CLIENT_INSEE_B WHERE NO_INSEE = @TheInsee
SELECT @CountC = COUNT(*) FROM LS_CLIENT_INSEE_C WHERE NO_INSEE = @TheInsee
SELECT @CountD = COUNT(*) FROM LS_CLIENT_INSEE_D WHERE NO_INSEE = @TheInsee
SELECT @CountN = COUNT(*) FROM LS_CLIENT_INSEE_N WHERE NO_INSEE = @TheInsee
SELECT @CountP = COUNT(*) FROM LS_CLIENT_INSEE_P WHERE NO_INSEE = @TheInsee

SELECT @CountN1 = COUNT(*) FROM LS_CLIENT_INSEE_N1 WHERE NO_INSEE = @TheInsee
SELECT @CountN2 = COUNT(*) FROM LS_CLIENT_INSEE_N2 WHERE NO_INSEE = @TheInsee
SELECT @CountN3 = COUNT(*) FROM LS_CLIENT_INSEE_N3 WHERE NO_INSEE = @TheInsee
SELECT @CountN4 = COUNT(*) FROM LS_CLIENT_INSEE_N4 WHERE NO_INSEE = @TheInsee
SELECT @CountN5 = COUNT(*) FROM LS_CLIENT_INSEE_N5 WHERE NO_INSEE = @TheInsee
SELECT @CountN6 = COUNT(*) FROM LS_CLIENT_INSEE_N6 WHERE NO_INSEE = @TheInsee

set @Zone = 
      CASE 
         WHEN @CountA >  0   THEN 1
         WHEN @CountB >  0   THEN 2
         WHEN @CountC >  0   THEN 3   
         WHEN @CountD >  0   THEN 4
         WHEN @CountN >  0   THEN 5
         WHEN @CountP >  0   THEN 6  
         WHEN @CountN1 >  0   THEN 7
         WHEN @CountN2 >  0   THEN 8
         WHEN @CountN3 >  0   THEN 9
         WHEN @CountN4 >  0   THEN 10
         WHEN @CountN5 >  0   THEN 11
         WHEN @CountN6 >  0   THEN 12   
         ELSE 1    
      END

RETURN @Zone  

END

正常に動作しますが、各テーブルのデータが非常に大きい場合、タイムアウトのためにハングアップします。このストアド プロシージャを単純化できるかどうか疑問に思っています。

このストアド プロシージャは非常に単純です。入力を与えるだけ@TheInseeで、見つかった 6 つのテーブルを検索します。

何か助けてください?

4

1 に答える 1

0

まず、各テーブルに少なくとも 1 つの行が存在するかどうかを確認するだけなので、すべての行を数えても意味がありません。第 2 に、前のテーブルで既に行が見つかっている場合、すべてのテーブルをクエリしても意味がありません。

私はこのようなことをします:

set @Zone = case
    when exists (select * from dbo.LS_CLIENT_INSEE_A where NO_INSEE = @TheInsee) then 1
    when exists (select * from dbo.LS_CLIENT_INSEE_B where NO_INSEE = @TheInsee) then 2
    -- etc.
    else 1
    end
于 2013-01-08T16:07:12.893 に答える