【问题标题】:Stored procedure not returning all rows存储过程不返回所有行
【发布时间】:2013-10-03 15:33:16
【问题描述】:

这可能是基本的,但我对 SQL 很陌生。我有一个在 2 个日期之间返回记录的存储过程。存储过程代码:

    CREATE PROCEDURE [dbo].[getSuggestionsByName] 

    @fromDate nvarchar(50),
    @toDate nvarchar(50)
AS
BEGIN
    SELECT name, unit, dept, ref, shortDescription, dateRaised, dateCompleted, suggestionType, awardType, awardAmount, dateCollected
    FROM suggestion.dbo.suggestions
    where dateRaised BETWEEN @fromDate and @toDate
END

GO

我正在使用以下命令进行测试:

exec getSuggestionsByName @fromdate = '1/09/2013', @todate = '3/10/2013'

这仅返回 3 行,如下所示:

但是,当我在 dbo.suggestions 表上执行“选择前 1000 行”时,我会得到更多符合以下条件的行:

我不确定为什么程序没有返回这些记录

【问题讨论】:

  • dateRaised 列的数据类型是什么?为什么参数传递为nvarchar?如果您存储为字符串,则该格式将无法正确排序。所以BETWEEN 不起作用。使用date[time] 数据类型。
  • 尝试后会得到什么:exec getSuggestionsByName fromdate = '01/09/2013', todate = '03/10/2013' ?
  • 请发布表定义。
  • Martin:我想使用日期数据类型,但由于无效转换等原因,我的 Web 应用程序和数据库之间的通信遇到了真正的麻烦,所以我将所有内容存储为 nvarchar。我知道这是不正确的,但它在大多数情况下都有效。我尝试在这种情况下将参数作为日期数据类型传递并不断出错

标签: sql sql-server stored-procedures


【解决方案1】:

试试这个

SELECT name, unit, dept, ref, shortDescription, dateRaised, dateCompleted, suggestionType, awardType, awardAmount, dateCollected
FROM suggestion.dbo.suggestions
where convert(datetime,dateRaised,103) BETWEEN convert(datetime,@fromDate,103) and convert(datetime,@toDate,103)

发生这种情况是因为您的 column(dateRaised)parameters(@fromDate , @toDate) 都是 varchar,当您在 2 个 varchar 之间有条件时,您将得到您所看到的结果。 当您将 '1' 和 '2' 定义为 varchar 时,意味着 '11' 介于 '1' 和 '2' 之间

【讨论】:

  • 谢谢达瓦尔。这行得通,而且解释很有意义。理想情况下,我需要学习如何像@Martin Smith 建议的那样正确使用日期数据类型,但我很难让它在我的网络应用程序中正常工作。
  • @Jimsan 是的,你是对的 .. 实际上我们应该只将日期存储在日期列中并在 YYYY-MM-DD 中传递值(或者你可以使用 convert(datetime,@input,103)从前端插入 ) 。如果可能,则始终将数字存储在 int 、 decimal 或 float 中,并将 date 存储在 date 、 datetime 、 datetime2 数据类型中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
相关资源
最近更新 更多