簡體   English   中英

在SQL Server中使用空數據參數調用存儲過程

[英]Call Stored Procedure with Null Data Parameter in SQL Server

EXECUTE listCustomer null, Null, Null, Null, Null, Null, Null, Null, 
    Null, Null, 'customer_id', 'asc' 

如果沒有定義任何篩選,我想選擇所有客戶。 下面是存儲過程:

ALTER PROCEDURE [dbo].[listCustomer] 
-- Add the parameters for the stored procedure here
@customer_id int = 0
, @customer_name varchar(111) = null
, @customer_email varchar(111) = null
, @customer_phone varchar(22) = null
, @customer_fax varchar(22) = null
, @customer_address varchar(255) = null
, @customer_contact_person varchar(50) = null
, @gl_account_id int = 0
, @createdon datetime = null
, @modifiedon datetime = null
, @order_by varchar(50) = 'customer_id'
, @sort_order varchar (5) = 'asc'
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
-- Insert statements for procedure here

select
    c.*
    , ga.gl_account_title
from
    customer c
left join   gl_account ga
on
    c.gl_account_id = ga.gl_account
where
    c.customer_id = ISNULL(@customer_id,c.customer_id)
    and
    c.customer_name like '%'+isnull(@customer_name,c.customer_name)+'%'
    and
    c.customer_email = ISNULL(@customer_email,c.customer_email) 
    and
    c.customer_phone = ISNULL(@customer_phone,c.customer_phone)
    and
    c.customer_fax = ISNULL(@customer_fax,c.customer_fax)
    and
    c.customer_address like '%'+ISNULL(@customer_address,c.customer_address)+'%'
    and
    c.customer_contact_person = ISNULL(@customer_contact_person,c.customer_contact_person)
    and
    c.gl_account_id = ISNULL(@gl_account_id,c.gl_account_id)
    and
    c.createdon = ISNULL(@createdon,c.createdon)
    --and
    --c.modifiedon = ISNULL(@modifiedon,c.modifiedon)
order by 
    case when @sort_order = 'asc' then
        case
            when @order_by = 'customer_id' then cast(c.customer_id as varchar)
            when @order_by = 'customer_name' then c.customer_name
            when @order_by = 'customer_contact_person' then c.customer_contact_person
            when @order_by = 'gl_acount_id' then cast(c.gl_account_id as varchar)
            when @order_by = 'createdon' then cast(c.createdon as varchar)
            when @order_by = 'modifiedon' then cast(c.modifiedon as varchar)
        end
    end asc
    , case when @sort_order = 'desc' then
        case
            when @order_by = 'customer_id' then cast(c.customer_id as varchar)
            when @order_by = 'customer_name' then c.customer_name
            when @order_by = 'customer_contact_person' then c.customer_contact_person
            when @order_by = 'gl_acount_id' then cast(c.gl_account_id as varchar)
            when @order_by = 'createdon' then cast(c.createdon as varchar)
            when @order_by = 'modifiedon' then cast(c.modifiedon as varchar)
        end
    end desc
END

當我從“ where”語句取消注釋modifiedon條件時,它沒有給出任何答案,意味着0行。 否則,當我評論它時,它給了我正確的答案。

我認為這是正在發生的,因為修改后的列中沒有任何內容,並且將其設置為NULL。

請告訴我我在哪里錯了。

對不起英語!

嘗試改變導致問題的條件:

(c.modifiedon = @modifiedon OR @modifiedon IS NULL)

您可能使用NULLIF

 NullIF(c.modifiedon,@modifiedon) IS NULL

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM