2010-11-13 168 views
0

我的SP有一個奇怪的問題。 我有一個SP,其中一個參數是nvarchar類型。 和我聲明的參數,我也包括值,但是當我運行沒有數據返回。 簡單的例子:sql存儲過程參數問題

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

SP怎麼叫? – Oded 2010-11-13 20:45:24

+0

通常一個好主意是提及你正在使用的數據庫。 NVARCHAR和語法使我認爲它是Microsoft SQL Server,但你應該是特定的。 – 2010-11-13 20:45:41

+0

您能否顯示完整的查詢? – 2010-11-13 20:46:39

回答

1

替換該行

@BookName nvarchar = null 

@BookName nvarchar(100) = null 

我希望這將解決您的問題。

0

最好的辦法是,你沒有真正傳遞參數到您的客戶端代碼的程序。確保這一點。您也可以通過運行它(「EXEC myProcedure('SQL Book')」)完全在SQL端測試過程,以查看您是否以這種方式得到正確的答案;那麼你會知道這是一個溝通問題。

+0

我做,太多,每當我將包括書參數,我沒有得到數據 – Laziale 2010-11-13 20:56:44

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 2010-11-13 20:53:45

+0

這就是我如何嘗試,我很抱歉,我不知道如何把文本放在代碼塊 – Laziale 2010-11-13 20:54:33

1

在您的存儲過程的定義,你'不給你的@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男人,這是問題:) – Laziale 2010-11-13 21:13:33