在临时表

时间:2017-01-20 19:56:58

标签: sql-server

我在SQL Server编码有问题,我正在尝试创建一个临时表,我存储了在while循环中创建的不同表,问题是它只存储了第一个表,但是当启动时它打破的第二个循环并给出错误:

  

(9267行受影响)       Msg 2714,Level 16,State 6,Line 16       数据库中已有一个名为“## EPIF_2010_2016”的对象。

Mi代码是:

DECLARE @MES INT
DECLARE @AÑO INT
SET @MES=01
SET @AÑO=2010

WHILE 

CAST(@AÑO AS VARCHAR) + CASE WHEN LEN(@MES)<2 THEN '0' + CAST(@MES AS VARCHAR(2)) 
ELSE + CAST(@MES AS VARCHAR(2))END <=
CAST(YEAR(GETDATE()) AS VARCHAR) + CASE WHEN LEN(MONTH(GETDATE()))<2 THEN'0'+CAST(MONTH(GETDATE()-1) AS VARCHAR(2)) 
ELSE +cast(MONTH(GETDATE()-1) AS VARCHAR(2))END

BEGIN

SELECT COUNT(CART.Producto_Poliza) AS VOLUMEN, 
SUM(CONVERT(FLOAT,REPLACE(CART.[Prima mensual],',','.'))) AS PRIMA_MENSUAL,
(CAST(@MES AS NVARCHAR(2))+'-01-'+CAST(@AÑO AS NVARCHAR(4))) AS [Inicio de Vigencia],
CART.[Descripción de la fuente],CART.[Descripción de la campaña], PROD.PROD_DESCRIPTION, SE.SubPlan
INTO ##EPIF_2010_2016
FROM CARTERA_DICIEMBRE_2016 CART
LEFT OUTER JOIN TBL_NEWPRODUCTSIISMX PROD ON PROD.PRODUCT_ID = CART.[Número del producto]
LEFT OUTER JOIN SENumber SE ON SE.[SE number] = CART.[Numero de Afiliación]

WHERE CAST(YEAR([Inicio de Vigencia])AS VARCHAR)+CASE WHEN LEN (MONTH([Inicio de Vigencia]))<2 
THEN '0'+CAST(MONTH([Inicio de Vigencia])AS VARCHAR) 
ELSE +CAST(MONTH([Inicio de Vigencia])AS VARCHAR)
END <= 
CAST(@AÑO as VARchar)+CASE WHEN LEN (@MES)<2 THEN '0'+CAST(@MES AS VARCHAR(2)) 
ELSE +cast(@MES AS VARCHAR(2))END
AND (CAST(YEAR([Fecha Cancelación])AS VARCHAR)+ CASE WHEN LEN (MONTH([Fecha Cancelación]))<2 
THEN '0'+CAST(MONTH([Fecha Cancelación])AS VARCHAR) 
ELSE +CAST(MONTH([Fecha Cancelación])AS VARCHAR)END > 
CAST(@AÑO as VARchar)+CASE WHEN LEN (@MES)<2 
THEN '0'+CAST(@MES AS VARCHAR(2)) 
ELSE +cast(@MES AS VARCHAR(2))END
OR [Fecha Cancelación] IS NULL)

GROUP BY CART.[Inicio de Vigencia],CART.[Descripción de la fuente],CART.[Descripción de la campaña],
PROD.PROD_DESCRIPTION,SE.SubPlan

SET @AÑO= CASE WHEN @MES=12 THEN @AÑO+1
ELSE @AÑO END
SET @MES= CASE WHEN @MES<12 THEN @MES+1 
WHEN @MES=12 THEN 1 END

END;

在这种情况下,是否有像INSERT INTO这样的函数在我的临时表中插入每个新表## EPIF_2010_2016?

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果您真的想使用循环,则需要创建临时表,然后使用insert into ##...

create table ##epif_2010_2016 (
  volumen bigint
, prima_mensual float
, [Inicio de Vigencia] date
, [Descripción de la fuente]  nvarchar(256)
, [Descripción de la campaña] nvarchar(256)
, prod_description nvarchar(256)
, SubPlan nvarchar(256)
)

while ..... 
begin
insert into ##epif_2010_2016 (
    volumen
  , prima_mensual float
  , [Inicio de Vigencia] 
  , [Descripción de la fuente] 
  , [Descripción de la campaña]
  , prod_description
  , SubPlan
  )
  select...

根本不需要使用循环。您可以借助于月表/子查询/公用表表达式来执行基于集合的操作:

declare @fromdate date = '20100101';
declare @thrudate date = dateadd(month, datediff(month, 0, @mydate)-1, 0);

;with Months as (
select top (datediff(month,@fromdate,@thrudate)+1)
      [Month] = dateadd(month
                , row_number() over (order by number) -1
                , @StartDate)
  from master.dbo.spt_values
)

select 
    volumen=count(cart.Producto_Poliza)
  , prima_mensual= sum(convert(float, replace(cart.[Prima mensual], ',', '.'))) 
  , [Inicio de Vigencia] = m.[Month]
  , cart.[Descripción de la fuente]
  , cart.[Descripción de la campaña]
  , prod.prod_description
  , se.SubPlan
  into ##epif_2010_2016
 from cartera_diciembre_2016 as cart
  inner join Months as m 
    on cart.[Inicio de Vigencia] <= m.Month
    and (cart.[Fecha Cancelación] > m.Month
        or cart.[Fecha Cancelación] is null)
  left join tbl_newproductsiismx as prod 
    on prod.product_id = cart.[Número del producto]
  left join senumber as se 
    on se.[se number] = cart.[Numero de Afiliación]
 group by 
    cart.[Inicio de Vigencia]
  , cart.[Descripción de la fuente]
  , cart.[Descripción de la campaña]
  , prod.prod_description
  , se.SubPlan;