2016-12-15 70 views
0

需要構建一個返回數據的存儲過程。 在客戶端,我有一個複選框,用於選擇一個值是否應爲null。MS SQL將參數傳遞給存儲的proc指示值爲空或非空

讓我們說列名稱是包。

Create PROCEDURE [dbo].[up_query_wt_paketsuche] 
(
    @packagenull int = 0 
) 
AS 
(
SELECT * FROM PACKAGES 
where ??? 
) 

所以我通過1爲@packagenull如果查詢應返回該包裝不空,什麼都值如果查詢應返回的所有值,其中包是空的。重點是處理where子句中的參數。 真正的存儲過程更復雜,12個參數,兩個表上的聯合...所以我想處理where子句中的參數。

謝謝。

編輯: 我的表格不是單個表格。 這裏是我的實際凡未經@packagenull

where f.vtyp6maske like @vtyp 
and f.marke like @marke 
and h.mkb like @mkb 
and (
     modjahr_von = @modelljahrvon 
    or 
     ( @modelljahrvon=999999 
     and (modjahr_von is null or modjahr_von is not null) 
     ) 
    ) 
and (modjahr_bis = @modbis 
     or (
       @modelljahrbis = 999999 
       and (modjahr_bis is null or modjahr_bis is not null) 
      ) 
    ) 
and i.prnr like @prnr 
+1

你的where子句是可怕的,低效率和非常多餘的,這對於sql服務器沒有任何意義modjahr_von爲null或modjahr_von不爲空「,但sql server將不得不做很多工作來檢查條件。 –

回答

1

條款如果我正確你想基於參數行的全部或沒有理解你。這應該就夠了。

Create PROCEDURE [dbo].[up_query_wt_paketsuche] 
(
    @packagenull int = 0 
) 
AS 

SELECT * FROM PACKAGES 
where @packagenull is NULL or someColumn = @packagenull 



where f.vtyp6maske like '%' + @vtyp + '%'       --Added concat here 
and f.marke like '%' + @marke + '%' and h.mkb like '%' + @mkb + '%' --Added concat here 
and (modjahr_von = @modelljahrvon or 
(@modelljahrvon=999999 and 
(modjahr_von is null or modjahr_von is not null))) 
and (modjahr_bis = @modbis or (@modelljahrbis = 999999 
and (modjahr_bis is null or modjahr_bis is not null))) 
and i.prnr like '%' + @prnr + '%'         --Added concat here 
and (@packagenull is null or package = @packagenull)     --Added additional parameter 
+0

再次閱讀OP問題後,我認爲他們希望得到結果。重新閱讀程序下的第一句話。 –

+0

啊好抓@WEI_DBA – scsimon

+0

我用我的where子句之一修改了我的問題。希望它能讓我更容易理解我的問題。需要添加@packagenull參數 – Sardoan

0

@scsimon對不起,我沒有得到意義。 @packagenull是一個可選參數,因此它永遠不會爲空,默認爲0。 package = @packagenull永遠不會是真的,因爲package永遠不是0或1,它是一個字符串。我想要的是package!= null當@ packagenull = 1和package = null時@packnull = 0

+0

可選參數並不意味着該值不能爲空。這意味着您在省略參數時提供了默認值。如果您傳遞參數並且該值爲NULL,那麼您的默認值將被忽略。 –

+0

在代碼中,我不提供一個值,所以這兩個選項都是0或1.因此,正如我所說,0或1,沒有別的。空ist不是一個選項,默認值= 0。 – Sardoan

相關問題