【问题标题】:Search Records in RDLC Report FromDate to ToDate在 RDLC 报告 FromDate 到 ToDate 中搜索记录
【发布时间】:2019-12-28 14:55:57
【问题描述】:

我有一份报告,报告的数据来自 Tbl_Orders 表,其中我有一个名为 CreatedDate 的列。

我在报告上方进行了搜索,我需要在其中按名称搜索并按 FromDate 到 ToDate 搜索。 例如,如果我从 FromDate 中选择任何日期,并且应在所选日期之间显示 ToDate 记录中的日期。

以下是我的查询

CREATE PROC Sp_Search_RatingAndReviewsReport (@Name nvarchar(200),
                                              @FromDate nvarchar(200),
                                              @ToDate nvarchar(200))
AS
BEGIN

    SELECT a.*,
           b.Name,
           CONVERT(nvarchar(20), a.CreatedDate, 105) AS Date
    FROM Tbl_CustomerRating a
         LEFT JOIN Tbl_Customer b ON a.CustomerId = b.CustomerId
    WHERE (b.Name LIKE '%' + @Name + '%'
        OR @Name = '')
      AND (CONVERT(nvarchar(20), a.CreatedDate, 101) BETWEEN (@FromDate) AND (@ToDate));

如果我使用上述查询,它可以正常搜索 FromDate 到 ToDate 但我无法按名称搜索,如果我删除 这一行

(convert(nvarchar(20),a.CreatedDate,101)between(@FromDate)and(@ToDate))

然后按名称搜索工作正常,但我无法按 FromDate 搜索到 ToDate

请帮我解决这个问题

【问题讨论】:

标签: c# asp.net sql-server search


【解决方案1】:

您在此处拥有的内容称为 Catch-all 或 "Kitchen Sink" 查询。最好使用参数化动态 SQL 来处理这些问题。

假设您的所有参数都是可选的(尽管如果@FromDate 已通过,那么@ToDate 也应通过)。因此,您想要的很可能是这样的:

--Removed prefix, per comment under question
CREATE PROC dbo.Search_RatingAndReviewsReport (@Name nvarchar(200) = NULL, --I ASSUME that Tbl_CustomerRating.Name is an nvarchar too?
                                               @FromDate date = NULL, --Why was this an nvarchar? How many dates exist with unicode characters?
                                               @ToDate date = NULL)
AS BEGIN

    DECLARE @SQL nvarchar(MAX);

    SET @SQL = N'SELECT CR.{List your columns}, --If you''re seeing braces, you haven''t replaced this as directed' + NCHAR(13) + NCHAR(10) + --Replace this with your columns, don't use * in a precompiled object
               N'       C.[Name]' + NCHAR(13) + NCHAR(10) +
               --Created Date is already in your previous a.*, therefore no need to repeat it. 
               --If you want it in a specific format, then get your presentation layer to do that, not SQL Server
               N'FROM dbo.Tbl_CustomerRating CR' + NCHAR(13) + NCHAR(10) + --Customer and Rating start with C and R, not "a"
               N'     JOIN dbo.Tbl_Customer C ON CR.CustomerId = C.CustomerId' + NCHAR(13) + NCHAR(10) + --Customer starts with C, not b. Also changed to a JOIN due to the WHERE
               N'WHERE ';
    --Now for the fun part, the dynamic WHERE
    DECLARE @WHERE nvarchar(MAX) = N'';

    IF @Name IS NOT NULL --If @Name isn't NULL, add it to the WHERE
        SET @WHERE = @WHERE + NCHAR(13) + NCHAR(10) + N'  AND C.[Name] = @Name'
    IF @FromDate IS NOT NULL OR @ToDate IS NOT NULL --If either of the dates aren't NULL add it to the WHERE (note that is one is NULL then no results will be returned)
        SET @WHERE = @WHERE + NCHAR(13) + NCHAR(10) + N'  AND CR.CreatedDate BETWEEN @FromDate AND @ToDate'
    SET @WHERE = STUFF(NULLIF(@WHERE,''),1,8,''); --The NULLIF will turn the value to NULL if no parameters were supplied
    SET @SQL = @SQL + @WHERE + N';';

    PRINT @SQL; --Your best friend
    --EXEC sp_executesql @SQL, N'@Name nvarchar(200), @FromDate date, @ToDate date', @Name, @FromDate, @ToDate; --Uncomment to run the dynamic statement
END;

请注意,您需要消化该 SQL 中有 大量 的 cmets,并且您还需要更改大括号 ({}) 中的部分(根据相邻的评论)。

然后你可以测试运行它,你会得到以下结果:

EXEC dbo.Search_RatingAndReviewsReport;

不返回任何内容(没有 PRINT,不是数据集),因为没有参数

EXEC dbo.Search_RatingAndReviewsReport @Name = N'John Smith';

将运行以下 SQL:

SELECT CR.{List your columns}, --If you're seeing braces, you haven't replaced this as directed
       C.[Name]
FROM Tbl_CustomerRating CR
     JOIN Tbl_Customer C ON CR.CustomerId = C.CustomerId
WHERE C.[Name] = @Name;

EXEC dbo.Search_RatingAndReviewsReport @FromDate = '20190101', @ToDate = '20190601';

返回下面的 SQL:

SELECT CR.{List your columns}, --If you're seeing braces, you haven't replaced this as directed
       C.[Name]
FROM Tbl_CustomerRating CR
     JOIN Tbl_Customer C ON CR.CustomerId = C.CustomerId
WHERE CR.CreatedDate BETWEEN @FromDate AND @ToDate;

最后:

EXEC dbo.Search_RatingAndReviewsReport @Name = N'Jane Bloggs', @FromDate = '20190101', @ToDate = '20190601';

将运行 SQL:

SELECT CR.{List your columns}, --If you're seeing braces, you haven't replaced this as directed
       C.[Name]
FROM Tbl_CustomerRating CR
     JOIN Tbl_Customer C ON CR.CustomerId = C.CustomerId
WHERE C.[Name] = @Name
  AND CR.CreatedDate BETWEEN @FromDate AND @ToDate;

dbo. 没有出现在上面打印的 SQL 中,因为我在粘贴上面执行的值之后将它添加到 SP 的定义中。

【讨论】:

  • 问题是逗号。请参阅上面的回复。
  • @jdweng 不,不是。
  • OP 说如下:“我无法按名称搜索,如果我删除此行 (convert(nvarchar(20),a.CreatedDate,101)between(@FromDate)and(@ ToDate))" 没有理由删除该行不应该产生任何结果。这就是为什么我更喜欢使用 SQL 查询将逗号放在行首以防止这些类型错误。 “FROM”前不能有逗号。
  • 阅读 OP 的完整句子 @jdweng "如果我删除这行 {SQL Statement},那么它可以正常按名称搜索,但我无法按 FromDate 到 ToDate 搜索" i> 那是一个句子。逗号实际上与问题无关。他们明确表示,当他们提供名称(我假设没有日期)时,他们没有得到任何结果。可能是因为他们(愚蠢地)提供了“日期”''(又名 1900 年 1 月 1 日),并且他们没有在该日期创建的客户。
  • “不工作” 对我来说毫无意义 @murtuza 。您遇到什么错误或意外的,或者不受欢迎的行为?关于正在运行的 SQL,“你最好的朋友”告诉你什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
相关资源
最近更新 更多