2010-11-13 5 views
0

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

@BookName nvarchar = null 

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

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 
+0

Как называется SP? – Oded

+0

Как правило, рекомендуется указать, какую базу данных вы используете. NVARCHAR и синтаксис заставляют меня думать, что это Microsoft SQL Server, но вы должны быть конкретными. –

+0

Не могли бы вы показать полный запрос? –

ответ

1

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

@BookName nvarchar = null 

с

@BookName nvarchar(100) = null 

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

0

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

+0

Я тоже это делаю, когда я буду включать параметр книги, я не получаю данные – Laziale

0

Если звонок из .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

, если (! BookName.Equals (string.Empty)) { commAdvanced.Parameters.Add ("@ BookName", SqlDbType. NVarChar) .Value = bookName; } else { commAdvanced.Parameters.Add ("@ BookName", SqlDbType.NVarChar) .Value = DBNull.Value; } – Laziale

+0

вот как я пытаюсь, извините, я не знаю, как положить текст в блок кода – Laziale

1

В хранимой определения Proc, вы 're не давая ваш @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

Thx man, в этом была проблема :) – Laziale