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