Parametreye bağlı olarak saklı yordamımdaki verileri dahil et/hariç tut

Depolanmış yordamda satır eklemesi gereken veya bir parametrenin değerine bağlı olmayan bir sorun vardı

  • if @var_exclude = 'Y' I need to show only rows that mytable.field1 = 'N'
  • if @var_exclude = 'N' I need to show all rows

Aşağıdaki sorguyu kullanıyorum ancak düzgün çalışmıyor

Kodum gibi

@var_exclude    varchar(1)

    select mytable.field1, mytable.field2, mytable.field3, mytable.field4,mytable.field5 
    from mytable
Where mytable.field6 is null
  and mytable.field1 is not null
  and (mytable.state = @paramstate or @paramstate = 'ALL')
  and  mytable.field1 = Case when @var_exclude= 'Y' Then 'N' Else @var_exclude End
End

Kafam karıştı!

0
Buna D prosedürü denir - SQL Server'da saklanır - bir "mağaza" ile ilgisi yoktur. Ayrıca: eğer sadece tek bir karakteriniz varsa - bunu CHAR (1) yapın - bunu VARCHAR (1) yapmanıza gerek yoktur (en az 2 baytlık ek yüke sahiptir) !)
katma yazar marc_s, kaynak

2 cevap

Mantıksal işleminiz @var_exclude yanlış.

@var_exclude = 'Y' ilettiğinizde, sorgunuz temel olarak çözülür:

select .....
from mytable
where mytable.field6 is null 
  and mytable.field1 is not null
  and (mytable.state = @paramstate or @paramstate = 'ALL')
  and mytable.field1 = 'N'

bu durumda, @ var_exclude = 'Y' olduğunda, sonra CASE deyiminizin 'N' kısmı kullanılır.

Başka bir şey iletirseniz, geçtiğiniz değeri alırsınız; @var_exclude = 'N' 'i iletirseniz, sorgunuz şu şekilde çözümlenir:

select .....
from mytable
where mytable.field6 is null 
  and mytable.field1 is not null
  and (mytable.state = @paramstate or @paramstate = 'ALL')
  and mytable.field1 = 'N'

bu durumda, CASE deyiminizin Else @var_exclude - ve @var_exclude = 'N' olduğundan, önceki ile aynı sorguyu alırsınız.

Muhtemelen bu prosedürü şöyle yazabilirim:

CREATE PROCEDURE dbo.GetData 
     @paramstate VARCHAR(???),
     @var_exclude CHAR(1)
AS BEGIN 
   IF @var_exclude = 'N' THEN
      SELECT
         t.field1, t.field2, t.field3, t.field4, t.field5 
      FROM 
         dbo.mytable t
      WHERE 
         t.field6 IS NULL
         AND t.field1 IS NOT NULL
         AND (t.state = @paramstate OR @paramstate = 'ALL')

   ELSE
      SELECT
         t.field1, t.field2, t.field3, t.field4, t.field5 
      FROM 
         dbo.mytable t
      WHERE 
         t.field6 IS NULL
         AND t.field1 IS NOT NULL
         AND (t.state = @paramstate OR @paramstate = 'ALL')
         AND t.field1 = 'N'
END
1
katma
@ user1004299: neden verimli değil ?? Bence yapabileceğin en iyisi, gerçekten, çünkü bir durumda, bu ek kısıtlamaya sahip olmalısın, öbür durumda da, sen bunu yapmazsın ... aksi halde bunu modellemek için iyi bir yol yok ... .
katma yazar marc_s, kaynak
Yardım ettiğin için teşekkürler, ben böyle yazdım, ama bence bu kadar basit değil, benim sorgum bu örnek gibi basit değil ve bunu korumak için gelecekte çok dikkatli olmalıyım.
katma yazar user1004299, kaynak

Hey herkes hala böyle bir şey arıyorsa, aslında buradaki cümlede yapabilirsiniz, bir IN deyimi yazmanız ve durumu aşağıdaki gibi değerlendirmeniz gerekir:

DECLARE @Include bit
SELECT ISNULL(CASE @Include WHEN 1 THEN 1 END,0)
UNION
SELECT ISNULL(CASE @Include WHEN 1 THEN 0 END,0)

Yani bu değerlendirecek:

IF @Include = 1 THEN 0,1
ELSEIF @Include = 0 THEN 0
END

Yani tek yapmanız gereken WHERE maddesinde bir IN cümlesi yazmak.

SELECT * FROM store 
WHERE values IN (
SELECT ISNULL(CASE @Include WHEN 1 THEN 1 END,0)
UNION
SELECT ISNULL(CASE @Include WHEN 1 THEN 0 END,0)
)

Umarım bu gelecekte kimseye yardım eder!

0
katma