sql存储过程参数问题

时间:2010-11-13 20:42:31

标签: sql sql-server-2008 stored-procedures

我的一个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。

任何想法可能是什么原因? 感谢

更新: 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 个答案:

答案 0 :(得分: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 !!
)

答案 1 :(得分:1)

替换此行

@BookName nvarchar = null

@BookName nvarchar(100) = null

我希望这能解决您的问题。

答案 2 :(得分:0)

最好的办法是,您实际上并未将参数从客户端代码传递到过程中。确保这一点。您也可以通过运行它来完全在SQL端测试该过程(“EXEC myProcedure('SQL Book')”)以查看您是否以这种方式得到了正确的答案;然后你会知道这是一个沟通问题。

答案 3 :(得分: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