2014-07-07 21 views
-3

我想创建一个SQL代码,允许我根据特定月份创建列,现在我有这个语法,但是当我运行它时,它会显示我的错误。你能告诉我我做错了什么吗?创建一个SQL语句根据特定的月份创建列

alter proc N50_Actualizar_PA 
@fecha varchar(6) 
as 
begin 

declare @fin int 
declare @cont int 
declare @query varchar(5000) 
declare @query1 varchar(900) 
declare @query2 varchar(900) 
declare @query3 varchar(900) 

set @fin = (SELECT day(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,@fecha+'01')+1, 0)))) 
set @cont = 1 
set @query3 = 'while '[email protected]+' <= '[email protected]+' 
begin 
set @query = ''S''+cast('[email protected]+' as varchar(2))+'' float,E''+cast('[email protected]+' as varchar(2))+'' float,'' 
exec (@query) 
set '[email protected]+' = '[email protected]+' + 1 
end' 

set @query1 = 'if not exists (select * from sysobjects where name = ''PLANTA_REP_PA_'[email protected]+''') 
begin 
create table PLANTA_REP_PA_'[email protected]+'(
ITEM int, 
UBIGEO varchar(255), 
CENTRO_POBLADO varchar(255), 
DISTRITO varchar(255), 
PROVINCIA varchar(255), 
DEPARTAMENTO varchar(255), 
TELEFONO varchar(255), 
TIPO varchar(255), 
OBSERVACION varchar(255), 
TECNOLOGIA varchar(255), 
ID_VSAT_BTS varchar(255), 
UBICACION_VSAT_BTS varchar(255), 
NIVEL_SENAL varchar(255), 
TIPO_ENERGIA varchar(255), 
COMENTARIOS varchar(255), 
CANT_LINEAS_B_ARRENDADOR varchar(255), 
'+ @query3 +' 
TOTAL_SALIENTE float, 
TOTAL_ENTRANTE float, 
SALIENTE_MOVILES float, 
ENTRANTE_MOVILES float) 
end 
else 
begin 
truncate table PLANTA_REP_PA_' + @fecha + ' 
end' 

set @query2 = 'INSERT INTO PLANTA_REP_PA_' + @fecha + ' 
Select * from Temp_Planta_Rep_PA' 

exec (@query3) 
print (@query1) 
print (@query2) 

end 
+1

发表您的错误全文... – AHiggins

+0

这是错误:男士245,级别16,状态1,过程N50_Actualizar_PA,第15行转换为varchar值时“而”数据类型 转换失败INT。 – Hitsugaya

+0

特定问题(我在查询中看到的至少三个问题之一)是,您试图连接一个文本字符串('begin set @query = ...'和一个整数变量(@cont)。需要在连接之前将其转换为varchar,然而,改变这个特定的问题并不能解决你的问题,因为你的明显目标的一般方法不会起作用,给我几分钟,我会看看我是否可以发布一个答案,让你指向正确的方向 – AHiggins

回答

1

一般问题1:这是一个贫穷的问题。你在这里得到了很多积极的回应,而且这很可能是因为你的问题和目标没有明确规定,而且你没有提供足够的信息。但如果这还不够糟糕,发布“修复我的代码”问题就会受到社区的极大反对。下次发布之前,请提供Read this

一般问题#2:这是一个可怕的的想法。你正在为特定的日期范围创建一个表格,你会盲目截短...是的。不是一个好设计。每个月新表都是不好的做法,但那是你的事。

SQL问题#1:您试图连接字符串和整数(set @query3 = 'while '[email protected]+' <= '[email protected]+' ...)。在这之前你必须将这些整数转换为字符串。这并不重要,因为

SQL问题#2:整个WHILE语句都是错误的。我认为这个陈述的目的是用你的列的名字填充一个变量。但它没有这样做。

SQL问题#2a - WHILE循环未连接列列表。再读一遍:你告诉SQL执行@query,在最好的情况下这将是S1 float, E1 float,。这不是一个SQL命令。你需要做的是set @query = @query + 'S1 ...。这样,它会建立字符串。

SQL问题#2b - 变量的长度是错误的。尝试将varchar(5000)查询填充到varchar(900)查询中不起作用。

SQL问题#3:您从不将列列表附加到表定义中。相反,通过写

CANT_LINEAS_B_ARRENDADOR varchar(255), 
'+ @query3 +' 
TOTAL_SALIENTE float, 

你告诉SQL的值设置为

CANT_LINEAS_B_ARRENDADOR varchar(255), 
while 1 <= 28 
begin 
set ... 
TOTAL_SALIENTE float, 

这不会有任何效果。什么你想要做的就是添加在连接字符串理论上安置在@query,在这种情况下,你应该写

CANT_LINEAS_B_ARRENDADOR varchar(255), 
'+ @query +' 
TOTAL_SALIENTE float, 

这仍然不会解决这个问题,因为

SQL问题#4 :你还没有执行@ query3。在尝试将这些值连接到表定义之前,您必须构建并设置@query的值。相反,您需要执行该WHILE循环,然后在将它与@ query1进行连接之前填充@query的值。

您的方法和实践中存在更多问题(例如在同一个块中包含TRUNCATE TABLE命令),但我认为这给了您一般想法,坦率地说,我不是堆栈溢出,所以我可以为你做你的工作。我来这里是因为我喜欢SQL,找出一个谜题很有趣......我来到这里是因为有人花时间向我解释了一些事情,如果我能帮助别人,这是我付钱的方式。

我打算在下面发布一个查询,这会让您更接近您的目标。这可能是一个糟糕的主意,因为提供给您不会强制您阅读我对代码的分析并自行进行更改。花时间比较两者,了解差异以及我为什么进行这些更改,然后从那里开始。有可能,它仍然需要调整,但在发布更多问题之前尝试自行解决。如果您收到错误讯息,请将其发送给Google。如果它运行但没有达到预期效果,请拔出打印的代码并通过它来找出原因。 Read this post关于询问“修复我的代码”问题。祝你好运!

declare @fecha varchar(6) 
set @fecha = '201402' 

declare @fin int 
declare @cont int 
declare @query varchar(5000) 
declare @query1 varchar(5000) 
declare @query2 varchar(900) 
declare @query3 varchar(900) 

set @fin = (SELECT day(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,@fecha+'01')+1, 0)))) 
print @fin 


set @cont = 1 
set @query = '' 
while @cont <= @fin 
    begin 
    set @query = 
     @query + ' 
     S' + cast(@cont as varchar(2))+' float, 
     E' + cast(@cont as varchar(2))+' float, ' 
    set @cont = @cont+ 1 
    end 

SET @query1 = ' 
IF NOT EXISTS (select * from sysobjects where name = ''PLANTA_REP_PA_'[email protected]+''') 
BEGIN 
CREATE TABLE PLANTA_REP_PA_'[email protected]+' 
    (
    ITEM int, 
    UBIGEO varchar(255), 
    CENTRO_POBLADO varchar(255), 
    DISTRITO varchar(255), 
    PROVINCIA varchar(255), 
    DEPARTAMENTO varchar(255), 
    TELEFONO varchar(255), 
    TIPO varchar(255), 
    OBSERVACION varchar(255), 
    TECNOLOGIA varchar(255), 
    ID_VSAT_BTS varchar(255), 
    UBICACION_VSAT_BTS varchar(255), 
    NIVEL_SENAL varchar(255), 
    TIPO_ENERGIA varchar(255), 
    COMENTARIOS varchar(255), 
    CANT_LINEAS_B_ARRENDADOR varchar(255), 
    '+ @query +' 
    TOTAL_SALIENTE float, 
    TOTAL_ENTRANTE float, 
    SALIENTE_MOVILES float, 
    ENTRANTE_MOVILES float 
) 
END 


TRUNCATE TABLE PLANTA_REP_PA_' + @fecha + ' 
end' 

set @query2 = 'INSERT INTO PLANTA_REP_PA_' + @fecha + ' 
SELECT * FROM Temp_Planta_Rep_PA' 

--exec (@query3) 
print @query3 
print (@query1) 
print (@query2)