Sql程序多年了?

时间:2011-11-19 11:29:48

标签: sql-server

在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

4 个答案:

答案 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