我有一个存储过程usp_gethomedata(<current year>),它只接受当前年份( 2012 )作为参数,并将01-01-2012的数据显示为2012年的当前日期,即26-11-2012。
我有另一个存储过程,它在usp_gethomedata(<start date>, <end date>)中显示了类似的数据,它有两个参数,开始和结束日期范围从01-01-1900到26-11-2012。
现在,我不确定如何从第一个存储过程内部调用第二个存储过程,以便它向我显示01-01-2012到26-11-2012的数据,前提是我必须记住。在调用第一个过程时,我只能从我的asp .net应用程序中提供2012年,即当前年份作为参数。
请帮帮忙。
发布于 2012-11-26 11:09:01
不,您不能创建重载的存储过程。其中一个将覆盖另一个。虽然重载函数是可能的。因此,将内部存储过程更改为某个不同的名称,反之亦然(即外部存储过程)。下面是一个模拟您的情况的示例。
-- 外部存储过程
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结果(部分)如下所示

希望这能有所帮助。
https://stackoverflow.com/questions/13557753
复制相似问题