2013-10-04 7 views
1
EXECUTE listCustomer null, Null, Null, Null, Null, Null, Null, Null, 
    Null, Null, 'customer_id', 'asc' 

Я хочу выбрать всех клиентов, если не определена какая-либо фильтрация. Ниже хранимая процедура:Вызов хранимой процедуры с параметром Null Data в SQL Server

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 

, когда я раскомментировать modifiedon условия из «где» заявления он не дает мне никакого ответа означает 0 строк. Else, когда я комментирую его, чтобы он дал мне правильный ответ.

Я думаю, что это происходит потому, что в измененном столбце ничего не заполнено, и оно установлено в NULL.

Пожалуйста, скажите мне, где я ошибаюсь.

Извините за английский!

+0

вам необходимо использовать динамический SQL для этой работы. –

+0

Он работал отлично до createon и modifiedon, но когда я добавил эти столбцы и установил начальное значение равным null. после этого это происходит – Asad

+0

Есть ли какое-либо решение для отправки параметра datetime null, чтобы он работал нормально, я думаю. – Asad

ответ

2

Попробуйте изменить условие, что это дает ваши проблемы:

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

Да Это нормально работает ... Позвольте мне проверить и другие критерии. – Asad

+0

Большое вам спасибо! – Asad

0

Вы можете использовать NULLIF

NullIF(c.modifiedon,@modifiedon) IS NULL 
Смежные вопросы