2010-11-13 161 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