我在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?
提前致谢。
答案 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;