Праблема з/выключыць дадзеныя ў маёй захоўваемай працэдуры ў залежнасці ад параметру

У мяне быў праблема ў маёй захоўваемай працэдуры, якая павінна ўключаць у сябе радок або няма ў залежнасці ад значэння параметру

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

Я выкарыстоўваю наступны запыт, але не працуе належным чынам

Мой код падобны

@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

Я заблытаўся!

0
Гэта называецца крама <�я> Працэдура D - а <�б> захоўваецца ў SQL Server, - гэта не мае нічога агульнага з "крама". Акрамя таго: калі ў вас ёсць толькі адзін знак - зрабіць яго CHAR (1) - няма неабходнасці, каб зрабіць яго VARCHAR (1) (які мае, па меншай меры, 2 байт накладных расходаў !)
дададзена аўтар marc_s, крыніца

2 адказы

Ваша логіка апрацоўкі @var_exclude няправільна.

Калі вы перадаеце @var_exclude = "Y" , то ваш запыт у асноўным атрымлівае вырашыў:

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'

так як у гэтым выпадку , калі @ var_exclude = "Y" Then «N» частку вашай артыкула СЛУЧАЙ выкарыстоўваецца.

Калі вы перадаеце што-небудзь яшчэ ў, то вы бераце значэнне, якое вы якія праходзяць у; так што калі вы перададзіце @var_exclude = «N» , то ваш запыт дазволены да:

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'

так як у гэтым выпадку Else @var_exclude вашай артыкула СЛУЧАЙ выкарыстоўваецца - і так як @var_exclude = «N» , вы атрымаеце сапраўды такі жа запыт, як і раней ....

Я б, напэўна, напісаць гэтую працэдуру нешта накшталт гэтага:

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
дададзена
@ User1004299: чаму б не эфектыўным ?? Я думаю, што гэта лепшае, што вы можаце зрабіць, на самай справе, так як у адным выпадку, вы павінны мець гэта дадатковае абмежаванне, у той час як у іншым выпадку, вы не .... там сапраўды няма добрага спосабу змадэляваць гэта інакш ... ,
дададзена аўтар marc_s, крыніца
Дзякуй вам за дапамогу, я пісаў, як гэта, але я думаю, што гэта не эфектыўны becuase мой запыт не проста як гэты ўзор і Я вельмі старанна ў будучыні, каб захаваць яго.
дададзена аўтар user1004299, крыніца

Эй, у выпадку, калі хто-то да гэтага часу шукае нешта накшталт гэтага, вы можаце зрабіць гэта ў пункце дзе вы павінны напісаць заяву ў і ацаніць стан наступным чынам:

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

Так што гэта будзе вылічвацца:

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

Так што ўсё, што вам трэба зрабіць, гэта напісаць артыкул IN у сказе WHERE.

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)
)

Я спадзяюся, што гэта дапамагае нехта ў будучыні!

0
дададзена