Sql server 传递多个参数的存储过程,条件结果不能按预期工作

Sql server 传递多个参数的存储过程,条件结果不能按预期工作,sql-server,stored-procedures,conditional-statements,Sql Server,Stored Procedures,Conditional Statements,我试图创建这个存储过程,但它并没有按预期工作,所以当我向其中传递参数时,不会返回结果 这是我的存储过程,它将返回结果: BEGIN DECLARE @sql NVARCHAR(MAX) SET NOCOUNT ON; SELECT TOP 100 * FROM [Test].[dbo].[Order] WITH (NOLOCK) WHERE [Deleted] = 0 AND ([Id] = @OrderId OR @OrderId = 0

我试图创建这个存储过程,但它并没有按预期工作,所以当我向其中传递参数时,不会返回结果

这是我的存储过程,它将返回结果:

BEGIN
    DECLARE @sql NVARCHAR(MAX)

    SET NOCOUNT ON;

    SELECT TOP 100 *
    FROM [Test].[dbo].[Order] WITH (NOLOCK)
    WHERE [Deleted] = 0
      AND ([Id] = @OrderId OR @OrderId = 0)
      AND ([StoreId] = @StoreId OR @StoreId = 0)
      AND ([WarehouseId] = @WarehouseId OR @WarehouseId = 0)
      // if I insert payment status and statement here no results are returned
      AND [CreatedOnUtc] >= ISNULL(@CreatedFromUtc, '1/1/1900')
      AND [CreatedOnUtc] < ISNULL(@CreatedToUtc, '1/1/2999')
END
AND ([PaymentStatusId] = @PaymentStatusId OR @PaymentStatusId = 0)

有人知道这是为什么吗?

它的安全使用
coalesce()
函数包含那些
null

  and iif(@PaymentStatusId = 0, 1, coalesce([PaymentStatusId], 0)) 
    = iif(@PaymentStatusId = 0, 1, @PaymentStatusId)

它的安全使用
coalesce()
函数包括那些
null

  and iif(@PaymentStatusId = 0, 1, coalesce([PaymentStatusId], 0)) 
    = iif(@PaymentStatusId = 0, 1, @PaymentStatusId)


谢谢@Metal,但它仍然没有返回任何results@chrisc,您如何声明您的@PaymentStatusId?就像这样,@PaymentStatusId int=0,Oh@Metal sql profiler向我显示它为null
@PaymentStatusId=null
在我的代码中,我将它设置为null<代码>(paymentStatusId.HasValue)?(对象)paymentStatusId:DBNull.Value已将
DBNull.Value
更改为
0
,并且它现在正在工作。你很有帮助,这是一个数据问题。再次感谢您的帮助:)谢谢@Metal,但它仍然没有返回任何results@chrisc,您如何声明您的@PaymentStatusId?就像这样,@PaymentStatusId int=0,Oh@Metal sql profiler向我显示它为null
@PaymentStatusId=null
在我的代码中,我将它设置为null<代码>(paymentStatusId.HasValue)?(对象)paymentStatusId:DBNull.Value已将
DBNull.Value
更改为
0
,并且它现在正在工作。你很有帮助,这是一个数据问题。再次感谢您的帮助:)有人会认为这是因为没有符合所有这些条件的记录。@avery\u larry如果将零作为参数传递,则查询的一部分应该是ignored@chrisc我建议您建立一个工作示例,您可以使用它向我们演示问题,这样我们就可以复制并粘贴您的代码和重现准确的问题。实际上,我们看不到表中的数据,也看不到数据类型。关于如何使用表变量实现这一点。您可以将SP的内容作为T-SQL进行测试,而不必将其放在SP内。这将假定零没有传递给@PaymentStatusId。您需要向我们展示实际的proc,以便我们可以查看声明,然后向我们展示如何调用/运行该proc。有什么错误吗?@chrisc-我的评论仍然代表未来的任何问题,它们使问题更容易回答,你做得越容易,就越有可能有人会提供帮助。有人会认为这是因为没有符合所有这些条件的记录。@avery_larry如果将零作为参数传递,则查询的一部分应该是ignored@chrisc我建议你建立一个工作的例子,你可以用它来向我们展示问题复制并粘贴您的代码,并重现确切的问题。实际上,我们看不到表中的数据,也看不到数据类型。关于如何使用表变量实现这一点。您可以将SP的内容作为T-SQL进行测试,而不必将其放在SP内。这将假定零没有传递给@PaymentStatusId。您需要向我们展示实际的proc,以便我们可以查看声明,然后向我们展示如何调用/运行该proc。有什么错误吗?@chrisc-我的评论仍然代表未来的任何问题,它们使问题更容易回答,你越容易回答,就越有可能有人会提供帮助。