【问题标题】:Returning Empty table in SQL Server after execute stored procedure执行存储过程后在 SQL Server 中返回空表
【发布时间】:2015-11-02 08:25:00
【问题描述】:

我的存储过程有问题。我对此有点困惑,因为我之前定义的存储过程可以正常工作,但现在它不起作用。

这里是 T-SQL 代码:

CREATE PROCEDURE [dbo].[getMonthMaxVal] 
    @from datetime,
    @to datetime
AS
BEGIN
    SET NOCOUNT ON;

    SELECT ds22.*
    FROM (SELECT 
                MAX(DAY(ds.datum)) AS TagMax,
                MONTH(ds.datum) AS MonatMax,
                YEAR(ds.datum) AS JahrMax,
                CONVERT(VARCHAR(10), MAX(ds.datum), 120) AS DatumMax
          FROM QR_DS022s ds
          WHERE ds.datum >= @from AND ds.datum <= @to
          GROUP BY MONTH(ds.datum), YEAR(ds.datum)) maxDate INNER JOIN QR_DS022s ds22 ON maxDate.DatumMax = ds22.datum
    ORDER BY ds22.datum
END

在 SQL Server 2008 R2 中,此存储过程运行良好。在 SQL Server 2014 中它不起作用。怎么了?

编辑:

当我使用代码执行 SP 时:

EXECUTE ETF_DB.dbo.getMonthMaxVal @from='2014-01-01', @to='2014-04-01'

我得到一个空列的空表。

当我这样做时:

EXECUTE ETF_DB.dbo.getMonthMaxVal @from='2014-01-01', @to='2014-04-02'

我收到一条错误消息:

将 varchar 数据类型转换为 datetime 数据类型时,值 超出范围。

【问题讨论】:

  • 定义工作/不工作。提供更多背景。分享相关架构。一般阅读How to Ask
  • @Amit 我猜你可以阅读我的存储过程。好吧,如果您理解上面的代码,您可以看到我想返回表 ds22 中的所有列,但只返回该月的最后一天。因此我定义了一个子选择。当我使用 EXECUTE ETF_DB.dbo.getMonthMaxVal @from='2014-01-01', @to='2014-04-01' 执行 SP 时,我得到一个空列的空表。
  • 尝试使用 DATE 数据类型而不是 DATETIME 和 VARCHAR 来处理只有日期的值,没有时间组件

标签: sql-server tsql stored-procedures sql-server-2008-r2 sql-server-2014


【解决方案1】:

虽然我看不到任何数据和表结构,但我会删除 VARCHAR 引用并全面使用 DATE:

CREATE PROCEDURE [dbo].[getMonthMaxVal] 
    @from   DATE,
    @to     DATE
AS
BEGIN
    SET NOCOUNT ON;

    SELECT ds22.*
    FROM (  SELECT 
                    MAX(DAY(ds.datum)) AS TagMax,
                    MONTH(ds.datum) AS MonatMax,
                    YEAR(ds.datum) AS JahrMax,
                    CONVERT(DATE, MAX(ds.datum)) AS DatumMax
              FROM QR_DS022s ds
              WHERE ds.datum >= @from AND ds.datum <= @to
              GROUP BY MONTH(ds.datum), YEAR(ds.datum)) maxDate 
          INNER JOIN QR_DS022s ds22 
            ON maxDate.DatumMax = CONVERT(DATE, ds22.datum)
    ORDER BY ds22.datum
END

如果这能解决您的问题,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2011-09-01
    • 2014-05-22
    • 2010-11-23
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    相关资源
    最近更新 更多