Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-允许WHERE中的null值,但仍基于其他参数返回数据_Sql_Sql Server 2005_Parameters - Fatal编程技术网

SQL-允许WHERE中的null值,但仍基于其他参数返回数据

SQL-允许WHERE中的null值,但仍基于其他参数返回数据,sql,sql-server-2005,parameters,Sql,Sql Server 2005,Parameters,这一点对我来说有点难以正确解释,所以请耐心听我说 我正在尝试创建一个动态SQL查询,以允许用户为我为查询创建的各种参数输入数据。如果填写了所有参数,我就可以运行它,但是我不知道如何允许这些参数中的一个或任何一个允许空值,并且仍然基于其他参数返回数据。例如,使用下面的查询信息,如果我将@Client参数设置为NULL,我希望为所有客户端返回相同的信息,而不是指定1个客户端。除了日期字段,我希望所有其他参数都有一个类似的函数,因为这些参数总是必需的 我希望允许空值的原因是这个查询的最终结果,我正在使

这一点对我来说有点难以正确解释,所以请耐心听我说

我正在尝试创建一个动态SQL查询,以允许用户为我为查询创建的各种参数输入数据。如果填写了所有参数,我就可以运行它,但是我不知道如何允许这些参数中的一个或任何一个允许空值,并且仍然基于其他参数返回数据。例如,使用下面的查询信息,如果我将@Client参数设置为NULL,我希望为所有客户端返回相同的信息,而不是指定1个客户端。除了日期字段,我希望所有其他参数都有一个类似的函数,因为这些参数总是必需的

我希望允许空值的原因是这个查询的最终结果,我正在使用VS2010中的Telerik编写一份报告,该报告将部署给我的公司使用。在telerik中,您可以允许参数在运行时为null。我们的目标是让这份报告在各种情况下都有用,基本上这样我就不必在接下来的一年里写100个不同的查询,也让用户对他们需要的东西有更多的控制/访问

这在SQL中可能吗

以下是我现在拥有的:

 DECLARE @Product int
    DECLARE @OrderDate1 datetime
    DECLARE @OrderDate2 datetime
    DECLARE @Status int
    DECLARE @Queue int
    DECLARE @Client int

    SET @Product = 86
    SET @OrderDate1 = '2012-09-01'
    SET @OrderDate2 = '2012-11-30'
    SET @Status = 80
    SET @Queue = 0
    SET @Client = 56156

    SELECT 
    CAST(oi.OrderID AS VARCHAR(MAX))+'.'+CAST(oi.OrderItemID AS VARCHAR(MAX)) AS OrderNumber
    ,CASE WHEN p.Abbreviation IS NULL THEN NULL
        ELSE p.Abbreviation END AS Product
    ,o.OrderDate
    ,v.ContactFirstName+' '+v.ContactLastName AS Vendor
    ,m.Description AS Status
    ,q.Description AS Queue

    FROM
    OrderItems oi
    JOIN Orders o (NOLOCK) ON o.OrderID = oi.OrderID
    JOIN Products p (NOLOCK) ON p.ProductID = oi.ProductID
    JOIN Vendors v (NOLOCK) ON v.VendorID = oi.VendorID
    JOIN Milestones m (NOLOCK) ON m.MilestoneID = oi.LastMilestoneID
    JOIN Queues q (NOLOCK) ON q.QueueID = oi.QueueID

    WHERE
    oi.ProductID in (@Product)
    and o.OrderDate BETWEEN @OrderDate1 and DATEADD(DD, 1, @OrderDate2)
    and oi.LastMilestoneID in (@Status)
    and oi.QueueID in (@Queue)
    and o.ClientID in (@Client)
DDL:


由于参数是单个值,因此我将使用
=
而不是
中的
。对于大型表来说,一种非常简单但效果不佳的方法是:

WHERE (@Product IS NULL OR oi.ProductID = @Product)
  AND (@Status IS NULL OR oi.LastMilestoneID = @Status)
  ... etc

您试图执行的是Erland Sommarskog所称的“动态搜索条件”。阅读本文了解您的所有选项以及每个选项的优点/缺点。

由于参数是单个值,我将使用
=
而不是
中的
。对于大型表来说,一种非常简单但效果不佳的方法是:

WHERE (@Product IS NULL OR oi.ProductID = @Product)
  AND (@Status IS NULL OR oi.LastMilestoneID = @Status)
  ... etc

您试图执行的是Erland Sommarskog所称的“动态搜索条件”。阅读本文了解您的所有选项以及每个选项的优点/缺点。

您使用的是参数化查询(这是问题所包含的内容)还是动态SQL查询(这将是一个长字符串)?对不起,我说的是使用参数化查询,而Richard的答案是正确的。您使用的是参数化查询吗(这是问题包含的内容)或动态SQL查询(可能是一个长字符串)?对不起,我是说在我说的地方使用参数化的Dynamic当Richard的答案是正确的时候。谢谢,我会试一试!我必须使用IN来使用telerik,因为用户可以为每个参数选择多个值。否则只能选择一个值。我想让这个报告尽可能广泛。只是运行了一些测试,这个totally完成了这个技巧,再次感谢。谢谢,我来试一试!我必须使用IN来使用telerik,因为用户可以为每个参数选择多个值。否则只能选择1个值。我想让这个报告尽可能广泛。只需运行一些测试,这完全完成了这个技巧,再次感谢。