0

我有一个存储过程usp_gethomedata(<current year>),它只将当前年份(2012 年)作为参数,并显示01-01-20122012 年当前日期的数据,即 26-11-2012。

我有另一个显示类似数据的存储过程,usp_gethomedata(<start date>, <end date>)其中包含 2 个参数开始和结束日期范围从01-01-190026-11-2012

现在,我不确定如何从第一个存储过程中调用第二个存储过程,以便它向我显示数据, 01-01-2012前提 26-11-2012是我必须记住.. 在调用第一个过程时,我只能提供 2012 即当前年作为我的 asp .net 应用程序的参数。

请帮忙。

4

1 回答 1

2

不,您不能创建重载的存储过程。一个会覆盖另一个。虽然重载功能是可能的。因此,将内部存储过程更改为其他名称,反之亦然(即外部存储过程)。这是一个模拟您的情况的示例。

--外部存储过程

USE [Test]
GO

-- exec [dbo].[USP_GetHomeData] 2012
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[USP_GetHomeData]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[USP_GetHomeData]
GO

CREATE PROCEDURE [dbo].[USP_GetHomeData] 
-- Add the parameters for the stored procedure here
(
    @Year INT
)
AS
BEGIN
        DECLARE @startDate DATETIME='1/1/' + CAST(@Year AS VARCHAR(4))  -- mm/dd/yyyy
        DECLARE @endDate DATETIME=GETDATE() -- mm/dd/yyyy

        SELECT [Date] = DATEADD(Day,Number,@startDate) 
        FROM  master..spt_values  WITH(NOLOCK)
        WHERE Type='P'
        AND DATEADD(day,Number,@startDate) <= @endDate

        exec [dbo].[USP_GetHomeData_Inner] '1/1/1900', @endDate
END

--内部存储过程

USE [Test]
GO

-- exec [dbo].[USP_GetHomeData_Inner] '1/1/1900', '11/25/2012'
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[USP_GetHomeData_Inner]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[USP_GetHomeData_Inner]
GO

CREATE PROCEDURE [dbo].[USP_GetHomeData_Inner] 
-- Add the parameters for the stored procedure here
(
    @startDate DATETIME
    ,@endDate DATETIME
)
AS
BEGIN

        ;WITH Calender AS 
        (
            SELECT @startDate AS CalanderDate
            UNION ALL
            SELECT CalanderDate + 1 FROM Calender
            WHERE CalanderDate + 1 <= @endDate
        )
        SELECT [Date] = CONVERT(VARCHAR(10),CalanderDate,25) 
        FROM Calender WITH(NOLOCK)
        OPTION (MAXRECURSION 0)
END

结果(部分)如下

在此处输入图像描述

希望这可以帮助。

于 2012-11-26T03:09:01.290 回答