Проблема с параметром хранимой процедуры SQL - PullRequest
0 голосов
/ 13 ноября 2010

У меня странная проблема с одним из моих SP. У меня есть SP и один из параметров типа nvarchar. и я объявляю параметр, я также включаю значение, но когда я работаю, данные не возвращаются. короткий пример:

 @BookName nvarchar = null

Тогда в предложении where у меня есть:

AND (o.BookName = @BookName OR @BookName IS NULL)

Данные не возвращаются.

Но когда я делаю:

AND (o.BookName = 'SQL Book' OR @BookName IS NULL)

Я получаю правильные результаты. Просто чтобы вы знали, что поле не FK.

Есть идеи, в чем может быть причина? Спасибо

UPDATE: SP СОДЕРЖАНИЕ:

ALTER PROCEDURE [dbo].[AdvancedSearch]
(
    @StartTime datetime = null,
    @EndTime datetime = null,
    @CustomerEmail nvarchar(255) = null,    
    @BookName nvarchar = null
    )
     AS
    BEGIN
    SET NOCOUNT ON

    SELECT DISTINCT o.OrderID, o.OrderTotal FROM Nop_Order o    
    WHERE (o.CreatedOn > @StartTime OR @StartTime IS NULL)
    AND (o.CreatedOn < @EndTime OR @EndTime IS NULL)
    AND (o.ShippingEmail = @CustomerEmail OR @CustomerEmail IS NULL)
    AND (o.BookName = @BookName OR @BookName IS NULL)
    ORDER BY o.OrderID

    END

Ответы [ 4 ]

1 голос
/ 14 ноября 2010

Заменить эту строку

@BookName nvarchar = null

с

@BookName nvarchar(100) = null

Надеюсь, это решит вашу проблему.

1 голос
/ 14 ноября 2010

В вашем сохраненном определении процедуры вы не дадите параметру @BookName никакой длины - я думаю, что SQL Server по умолчанию будет использовать только 1 символ в этом случае:

ALTER PROCEDURE [dbo].[AdvancedSearch]
(
  @StartTime datetime = null,
  @EndTime datetime = null,
  @CustomerEmail nvarchar(255) = null,    
  @BookName nvarchar = null   ** no length given!!
)

Попробуйте изменить это на подходящую длину, например, NVARCHAR(100) или что-то

ALTER PROCEDURE [dbo].[AdvancedSearch]
(
  @StartTime datetime = null,
  @EndTime datetime = null,
  @CustomerEmail nvarchar(255) = null,    
  @BookName nvarchar(100) = null   ** define a length !!
)
0 голосов
/ 13 ноября 2010

Если вы звоните из .NET, попробуйте

Dim param as New SqlParameter("@BookName", SqlDbType.NVarChar, 8) 

или DBType.String

После того, как вы разместили свое обновление:

ALTER PROCEDURE [dbo].[AdvancedSearch] 
( 
    @StartTime datetime = null, 
    @EndTime datetime = null, 
    @CustomerEmail nvarchar(255) = null,     
    @BookName nvarchar = null 
    ) 
     AS 
    BEGIN 
    SET NOCOUNT ON 

    SELECT DISTINCT o.OrderID, o.OrderTotal FROM Nop_Order o     
    WHERE (o.CreatedOn > @StartTime OR @StartTime IS NULL) 
    AND (o.CreatedOn < @EndTime OR @EndTime IS NULL) 
    AND (o.ShippingEmail = @CustomerEmail OR @CustomerEmail IS NULL) 
    AND (o.BookName = COALESCE(@BookName, BookName))
    ORDER BY o.OrderID 

    END
0 голосов
/ 13 ноября 2010

Лучше всего, чтобы вы фактически не передавали параметр в процедуру из своего клиентского кода. Убедитесь в этом. Вы также можете полностью протестировать процедуру на стороне SQL, запустив ее ("EXEC myProcedure ('SQL Book')"), чтобы проверить, получите ли вы правильный ответ таким образом; тогда вы узнаете, что это проблема со связью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...