在Sql Server中,我编写了一个过去3年的程序,其中包括今年,它只返回年份[如2011,2010,2009]。这是我的程序。是否需要进行任何优化?请检查程序。
create procedure UPS_GetYears
as
begin
declare @date varchar(10)
declare @i int=0
declare @var varchar(60)
declare @y int =-1
select @date = SUBSTRING (CONVERT (varchar,GETDATE(),103),7,4)
create table #Temp (years varchar(10))
while (@i < 3)
begin
insert into #Temp (years) values(@date )
select @date = SUBSTRING (convert(varchar, DATEADD (yyyy,@y,getdate()),103),7,4)
set @i=@i+1
set @y =@y-1
end
select * from #Temp
end
答案 0 :(得分:2)
我只是做
SELECT DATEPART(YEAR, GETDATE()) - N AS years
FROM (VALUES(0),
(1),
(2)) T(N)
为什么这是一个程序而不是TVF?
答案 1 :(得分:1)
这是使用递归CTE而不是临时表和放大器来实现它的有效方法。回路;
declare @start_year int = year(getdate())
;with years(year) as
(
select @start_year as year
union all
select year - 1
from years
where year > (@start_year - 2)
)
select * from years
答案 2 :(得分:1)
首先 - 如果你想要Years
- 为什么要返回VARCHAR(10)
而不是INT
??
返回INT时,您可以更轻松地做到这一点:
CREATE PROCEDURE UPS_GetYears
AS
BEGIN
DECLARE @currYear INT = YEAR(GETDATE())
DECLARE @Years TABLE(YearValue INT)
INSERT INTO @Years VALUES(@CurrYear), (@currYear -1), (@currYear -2)
SELECT * FROM @Years
END
运行此命令,它将2011, 2010, 2009
作为INT
答案 3 :(得分:0)
为什么要进入循环。尽量不要使用while或递归CTE,因为这些效率不高。请尝试以下代码 -
select * into abc
from
(
select top 3 year(getdate()) - row_number() over (order by (select 1))+1 as myyear
from sys.all_objects
) as qwe
select * from abc