comprobar existencia de un objeto tabla

21/05/2008 - 19:56 por Luis Mata | Informe spam
por que esto aveces funciona aveces no

if (select count(*) from sysobjects where xtype = 'U' and name = 'dtabla')=1

BEGIN

drop table dtabla

END

hago el select solo y da 1 pero ejecuta el procedimiento y no borra la
tabla.

pero correo esas lineas manualmente y si funciona



Att
Luis Mata Figueroa
Área Informática
Centro Cerámico Las Flores SAC
RPC: 993597297
TEL: 6174613

Preguntas similare

Leer las respuestas

#11 Gux (MVP)
22/05/2008 - 20:06 | Informe spam
Seré curioso: Por qué usted elimina y vuelve a crear la tabla?

Si necesita una tabla para uso temporal, use un CREATE TABLE #MiTabla o use
una variable de tipo TABLE. Si usted necesita que la tabla esté limpia de
datos, alcanzaría con DELETE o TRUNCATE (no es necesario destruir la tabla).

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/p...o.larriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Luis Mata" wrote:

ALTER procedure [dbo].[ventas_tiendas_all] @alm char(2), @mes1 char(10),
@mes2 CHAR(10), @modo int,@prov char(6)
as
-
IF OBJECT_ID('dbo.dtabla', 'U') IS NOT NULL
BEGIN
drop table dtabla
END
-
DECLARE @CAMPO varCHAR(6),@ejecuta varchar(150),@nbd varchar(6)
declare @vcodigo char(13),@vcantidad decimal(12,2),@ejecxbd
varchar(200),@ejecxtie varchar(250)
create table dtabla(proveedor char(6),codigo char(13),descripcion
varchar(150),guia int, costo decimal(12,4),publico
decimal(12,4), LINEA 8
vtatotal decimal(12,2))
if @prov=''
begin
insert into dtabla select cod3provee,codarticul,descripcio,0 as
guia,costo3,precvendol,0 as total
from bdcho.dbo.invmatpr where coidtalm = '10'
end
else
begin
insert into dtabla select cod3provee,codarticul,descripcio,0 as
guia,costo3,precvendol,0 as total
from bdcho.dbo.invmatpr where coidtalm = '10' and cod3provee=@prov
end
declare bdatos cursor for select nombre from maestro.dbo.openbd where based
!=9
open bdatos
fetch next from bdatos into @nbd
while @@fetch_status = 0
begin
set @campo = @nbd
set @ejecuta = 'alter table dtabla add '+@campo+' decimal(12,2) default 0
not null'
exec (@ejecuta)
if @prov=''
begin
set @ejecxtie = 'declare ventas cursor for select
codarticul,sum(cantidad) as cantidad from '+@campo+
'.dbo.archtra3 where fecha between '+''''+@mes1+''''+' and
'+''''+@mes2+''''+
' and coidtalm='+''''+@alm+''''+' group by codarticul'
end
else
begin
set @ejecxtie = 'declare ventas cursor for select
codarticul,sum(cantidad) as cantidad from '+@campo+
'.dbo.archtra3 where fecha between '+''''+@mes1+''''+' and
'+''''+@mes2+''''+
' and coidtalm='+''''+@alm+''''+' and proveedor='+''''+@prov+''''+' group
by codarticul'
end
exec (@ejecxtie)

open ventas
fetch next from ventas into @vcodigo,@vcantidad
while @@fetch_status = 0
begin
set @ejecxbd = 'update dtabla set guia = 1, '+@campo+' = '+cast(@vcantidad
as varchar(15))+',vtatotal=vtatotal+'+cast(@vcantidad as varchar(15))+
' where codigo='+''''+@vcodigo+''''
exec (@ejecxbd)
fetch next from ventas into @vcodigo,@vcantidad
end
deallocate ventas
fetch next from bdatos into @nbd
end
deallocate bdatos
alter table dtabla add totalc decimal (12,2) default 0 not null
alter table dtabla add totalp decimal (12,2) default 0 not null
update dtabla set totalc = costo*vtatotal,totalp = publico*vtatotal
if @modo=0
begin
select * from dtabla
end
else
begin
select * from dtabla where guia = 1
end
drop table dtabla


de mi procedimiento las lineas que resalte no se ejecutan cuando digamos
intencionalmente detuve la ejecucion del proc que lo creo en la linea 8
me sale este error cuando ejecuto con la tabla ya existiendo en la BD
Msg 213, Level 16, State 1, Procedure ventas_tiendas_all, Line 14

Insert Error: Column name or number of supplied values does not match table
definition.

del procedimiento selecciono manualmente las lineas :

IF OBJECT_ID('dbo.dtabla', 'U') IS NOT NULL
BEGIN
drop table dtabla
END

los ejecuto y me borra la tabla
ejecuto todo el procedimiento y ahi recien corre osea no puede eliminar la
tabla existente o algo asi?

Att
Luis Mata Figueroa
Área Informática
Centro Cerámico Las Flores SAC
RPC: 993597297
TEL: 6174613


"Gux (MVP)" escribió en el mensaje
news:
> Estoy algo confundido. Usted dice que si "el procedimiento lo dejan correr
> termina sin problema, el problema es cuando el usuario usa ctrl+alt+supr"
>
> Cuál es el sentido que el usuario haga CTRL-ALT-DEL para interrumpir?
>
> Mirado así sin los detalles, es casi como decir "todo funciona bien
> excepto
> cuando cortamos la energía eléctrica". Y no es para menos verdad? :-)
>
> Gustavo Larriera, Microsoft MVP
> https://mvp.support.microsoft.com/p...o.larriera
> Este mensaje se proporciona tal como es, sin garantías de ninguna clase.
>
>
>
> "Luis Mata" wrote:
>
>> este resultado me sale 1
>> select count(*) from sysobjects where xtype = 'U' and name = 'dtabla'
>> que segun el procedimiento deberia de eliminarlo para volver a crearlo
>> con
>> if (select count(*) from sysobjects where xtype = 'U' and name =
>> 'dtabla')=1
>> BEGIN
>> drop table dtabla
>> END
>>
>> menciono tambien que si el procedimiento lo dejan correr termina sin
>> problema, el problema es cuando el usuario usa ctrl+alt+supr y corta la
>> finalizacion del procedure.
>> pero lo mencionado anteriormente si arroja 1 y deberia de eliminarlo pero
>> no
>> lo hace
>> hago select a la tabla dtabla y esta ahi con datos y todo.
>> selecciono del procedure solamente:
>> if (select count(*) from sysobjects where xtype = 'U' and name =
>> 'dtabla')=1
>> BEGIN
>> drop table dtabla
>> END
>> lo ejecuto y se elimina
>> pero al ejecutar el procedure sin correr estas lineas manualmente sale el
>> error mencionado anteriormente
>> despues todo corre normal
>> algo tendra que ver el CTRL-ALT-SUPR
>> `
>> definitivamente no borra el objeto DTABLA
>>
>> ni con
>>
>> IF OBJECT_ID('dbo.dtabla', 'U') IS NOT NULL
>>
>> BEGIN
>>
>> drop table dtabla
>>
>> END
>>
>>
>>
>> Att
>> Luis Mata Figueroa
>> Área Informática
>> Centro Cerámico Las Flores SAC
>> RPC: 993597297
>> TEL: 6174613
>>
>>
>> "Luis Mata" escribió en el mensaje
>> news:
>> > Aqui les paso el procedure, ya no me sale el error cuando borro la
>> > tabla
>> > dtabla pero como se ve esta antes de la linea 13
>> >
>> > ALTER procedure [dbo].[ventas_tiendas_all] @alm char(2), @mes1
>> > char(10),
>> > @mes2 CHAR(10), @modo int,@prov char(6)
>> > as
>> > if (select count(*) from sysobjects where xtype = 'U' and name > >> > 'dtabla')=1
>> > BEGIN
>> > drop table dtabla
>> > END
>> > DECLARE @CAMPO varCHAR(6),@ejecuta varchar(150),@nbd varchar(6)
>> > declare @vcodigo char(13),@vcantidad decimal(12,2),@ejecxbd
>> > varchar(200),@ejecxtie varchar(250)
>> > create table dtabla(proveedor char(6),codigo char(13),descripcion
>> > varchar(150),guia int, costo decimal(12,4),publico decimal(12,4),
>> > vtatotal decimal(12,2))
>> > if @prov=''
>> > begin
>> > insert into dtabla select cod3provee,codarticul,descripcio,0 as
>> > guia,costo3,precvendol,0 as total
>> > from bdcho.dbo.invmatpr where coidtalm = '10'
>> > end
>> > else
>> > begin
>> > insert into dtabla select cod3provee,codarticul,descripcio,0 as
>> > guia,costo3,precvendol,0 as total
>> > from bdcho.dbo.invmatpr where coidtalm = '10' and cod3provee=@prov
>> > end
>> > declare bdatos cursor for select nombre from maestro.dbo.openbd where
>> > based !=9
>> > open bdatos
>> > fetch next from bdatos into @nbd
>> > while @@fetch_status = 0
>> > begin
>> > set @campo = @nbd
>> > set @ejecuta = 'alter table dtabla add '+@campo+' decimal(12,2) default
>> > 0
>> > not null'
>> > exec (@ejecuta)
>> > if @prov=''
>> > begin
>> > set @ejecxtie = 'declare ventas cursor for select
>> > codarticul,sum(cantidad) as cantidad from '+@campo+
>> > '.dbo.archtra3 where fecha between '+''''+@mes1+''''+' and
>> > '+''''+@mes2+''''+
>> > ' and coidtalm='+''''+@alm+''''+' group by codarticul'
>> > end
>> > else
>> > begin
>> > set @ejecxtie = 'declare ventas cursor for select
>> > codarticul,sum(cantidad) as cantidad from '+@campo+
>> > '.dbo.archtra3 where fecha between '+''''+@mes1+''''+' and
>> > '+''''+@mes2+''''+
>> > ' and coidtalm='+''''+@alm+''''+' and proveedor='+''''+@prov+''''+'
>> > group by codarticul'
>> > end
>> > exec (@ejecxtie)
>> >
>> > open ventas
>> > fetch next from ventas into @vcodigo,@vcantidad
>> > while @@fetch_status = 0
>> > begin
>> > set @ejecxbd = 'update dtabla set guia = 1, '+@campo+' > >> > '+cast(@vcantidad as varchar(15))+',vtatotal=vtatotal+'+cast(@vcantidad
>> > as
>> > varchar(15))+
>> > ' where codigo='+''''+@vcodigo+''''
>> > exec (@ejecxbd)
>> > fetch next from ventas into @vcodigo,@vcantidad
>> > end
>> > deallocate ventas
>> > fetch next from bdatos into @nbd
>> > end
>> > deallocate bdatos
>> > alter table dtabla add totalc decimal (12,2) default 0 not null
>> > alter table dtabla add totalp decimal (12,2) default 0 not null
>> > update dtabla set totalc = costo*vtatotal,totalp = publico*vtatotal
>> > if @modo=0
>> > begin
>> > select * from dtabla
>> > end
>> > else
>> > begin
>> > select * from dtabla where guia = 1
>> > end
>> > drop table dtabla
>> >
>> >
>> > Att
>> > Luis Mata Figueroa
>> > Área Informática
>> > Centro Cerámico Las Flores SAC
>> > RPC: 993597297
>> > TEL: 6174613
>> >
>> >
>> > "Gux (MVP)" escribió en el mensaje
>> > news:
>> >> Ayudaría mucho si usted muestra el procedimiento ventas_tiendas_all o
>> >> por
>> >> favor muestre la línea 13, para que no estemos adivinando.
>> >>
>> >> Gustavo Larriera, Microsoft MVP
>> >> https://mvp.support.microsoft.com/p...o.larriera
Respuesta Responder a este mensaje
#12 Luis Mata
22/05/2008 - 23:44 | Informe spam
no funciona con ninguna de las opciones si vez el procedure hay campos que
adiciono luego los campos son de nombre variable.
lo curioso es queno lo puedo eliminar desde el procedure ¿porque?


Att
Luis Mata Figueroa
Área Informática
Centro Cerámico Las Flores SAC
RPC: 993597297
TEL: 6174613


"Gux (MVP)" escribió en el mensaje
news:
Seré curioso: Por qué usted elimina y vuelve a crear la tabla?

Si necesita una tabla para uso temporal, use un CREATE TABLE #MiTabla o
use
una variable de tipo TABLE. Si usted necesita que la tabla esté limpia de
datos, alcanzaría con DELETE o TRUNCATE (no es necesario destruir la
tabla).

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/p...o.larriera
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Luis Mata" wrote:

ALTER procedure [dbo].[ventas_tiendas_all] @alm char(2), @mes1 char(10),
@mes2 CHAR(10), @modo int,@prov char(6)
as
-
IF OBJECT_ID('dbo.dtabla', 'U') IS NOT NULL
BEGIN
drop table dtabla
END
-
DECLARE @CAMPO varCHAR(6),@ejecuta varchar(150),@nbd varchar(6)
declare @vcodigo char(13),@vcantidad decimal(12,2),@ejecxbd
varchar(200),@ejecxtie varchar(250)
create table dtabla(proveedor char(6),codigo char(13),descripcion
varchar(150),guia int, costo decimal(12,4),publico
decimal(12,4), LINEA 8
vtatotal decimal(12,2))
if @prov=''
begin
insert into dtabla select cod3provee,codarticul,descripcio,0 as
guia,costo3,precvendol,0 as total
from bdcho.dbo.invmatpr where coidtalm = '10'
end
else
begin
insert into dtabla select cod3provee,codarticul,descripcio,0 as
guia,costo3,precvendol,0 as total
from bdcho.dbo.invmatpr where coidtalm = '10' and cod3provee=@prov
end
declare bdatos cursor for select nombre from maestro.dbo.openbd where
based
!=9
open bdatos
fetch next from bdatos into @nbd
while @@fetch_status = 0
begin
set @campo = @nbd
set @ejecuta = 'alter table dtabla add '+@campo+' decimal(12,2) default
0
not null'
exec (@ejecuta)
if @prov=''
begin
set @ejecxtie = 'declare ventas cursor for select
codarticul,sum(cantidad) as cantidad from '+@campo+
'.dbo.archtra3 where fecha between '+''''+@mes1+''''+' and
'+''''+@mes2+''''+
' and coidtalm='+''''+@alm+''''+' group by codarticul'
end
else
begin
set @ejecxtie = 'declare ventas cursor for select
codarticul,sum(cantidad) as cantidad from '+@campo+
'.dbo.archtra3 where fecha between '+''''+@mes1+''''+' and
'+''''+@mes2+''''+
' and coidtalm='+''''+@alm+''''+' and proveedor='+''''+@prov+''''+'
group
by codarticul'
end
exec (@ejecxtie)

open ventas
fetch next from ventas into @vcodigo,@vcantidad
while @@fetch_status = 0
begin
set @ejecxbd = 'update dtabla set guia = 1, '+@campo+' =
'+cast(@vcantidad
as varchar(15))+',vtatotal=vtatotal+'+cast(@vcantidad as varchar(15))+
' where codigo='+''''+@vcodigo+''''
exec (@ejecxbd)
fetch next from ventas into @vcodigo,@vcantidad
end
deallocate ventas
fetch next from bdatos into @nbd
end
deallocate bdatos
alter table dtabla add totalc decimal (12,2) default 0 not null
alter table dtabla add totalp decimal (12,2) default 0 not null
update dtabla set totalc = costo*vtatotal,totalp = publico*vtatotal
if @modo=0
begin
select * from dtabla
end
else
begin
select * from dtabla where guia = 1
end
drop table dtabla


de mi procedimiento las lineas que resalte no se ejecutan cuando digamos
intencionalmente detuve la ejecucion del proc que lo creo en la linea 8
me sale este error cuando ejecuto con la tabla ya existiendo en la BD
Msg 213, Level 16, State 1, Procedure ventas_tiendas_all, Line 14

Insert Error: Column name or number of supplied values does not match
table
definition.

del procedimiento selecciono manualmente las lineas :

IF OBJECT_ID('dbo.dtabla', 'U') IS NOT NULL
BEGIN
drop table dtabla
END

los ejecuto y me borra la tabla
ejecuto todo el procedimiento y ahi recien corre osea no puede eliminar
la
tabla existente o algo asi?

Att
Luis Mata Figueroa
Área Informática
Centro Cerámico Las Flores SAC
RPC: 993597297
TEL: 6174613


"Gux (MVP)" escribió en el mensaje
news:
> Estoy algo confundido. Usted dice que si "el procedimiento lo dejan
> correr
> termina sin problema, el problema es cuando el usuario usa
> ctrl+alt+supr"
>
> Cuál es el sentido que el usuario haga CTRL-ALT-DEL para interrumpir?
>
> Mirado así sin los detalles, es casi como decir "todo funciona bien
> excepto
> cuando cortamos la energía eléctrica". Y no es para menos verdad? :-)
>
> Gustavo Larriera, Microsoft MVP
> https://mvp.support.microsoft.com/p...o.larriera
> Este mensaje se proporciona tal como es, sin garantías de ninguna
> clase.
>
>
>
> "Luis Mata" wrote:
>
>> este resultado me sale 1
>> select count(*) from sysobjects where xtype = 'U' and name = 'dtabla'
>> que segun el procedimiento deberia de eliminarlo para volver a crearlo
>> con
>> if (select count(*) from sysobjects where xtype = 'U' and name >> >> 'dtabla')=1
>> BEGIN
>> drop table dtabla
>> END
>>
>> menciono tambien que si el procedimiento lo dejan correr termina sin
>> problema, el problema es cuando el usuario usa ctrl+alt+supr y corta
>> la
>> finalizacion del procedure.
>> pero lo mencionado anteriormente si arroja 1 y deberia de eliminarlo
>> pero
>> no
>> lo hace
>> hago select a la tabla dtabla y esta ahi con datos y todo.
>> selecciono del procedure solamente:
>> if (select count(*) from sysobjects where xtype = 'U' and name >> >> 'dtabla')=1
>> BEGIN
>> drop table dtabla
>> END
>> lo ejecuto y se elimina
>> pero al ejecutar el procedure sin correr estas lineas manualmente sale
>> el
>> error mencionado anteriormente
>> despues todo corre normal
>> algo tendra que ver el CTRL-ALT-SUPR
>> `
>> definitivamente no borra el objeto DTABLA
>>
>> ni con
>>
>> IF OBJECT_ID('dbo.dtabla', 'U') IS NOT NULL
>>
>> BEGIN
>>
>> drop table dtabla
>>
>> END
>>
>>
>>
>> Att
>> Luis Mata Figueroa
>> Área Informática
>> Centro Cerámico Las Flores SAC
>> RPC: 993597297
>> TEL: 6174613
>>
>>
>> "Luis Mata" escribió en el mensaje
>> news:
>> > Aqui les paso el procedure, ya no me sale el error cuando borro la
>> > tabla
>> > dtabla pero como se ve esta antes de la linea 13
>> >
>> > ALTER procedure [dbo].[ventas_tiendas_all] @alm char(2), @mes1
>> > char(10),
>> > @mes2 CHAR(10), @modo int,@prov char(6)
>> > as
>> > if (select count(*) from sysobjects where xtype = 'U' and name >> >> > 'dtabla')=1
>> > BEGIN
>> > drop table dtabla
>> > END
>> > DECLARE @CAMPO varCHAR(6),@ejecuta varchar(150),@nbd varchar(6)
>> > declare @vcodigo char(13),@vcantidad decimal(12,2),@ejecxbd
>> > varchar(200),@ejecxtie varchar(250)
>> > create table dtabla(proveedor char(6),codigo char(13),descripcion
>> > varchar(150),guia int, costo decimal(12,4),publico decimal(12,4),
>> > vtatotal decimal(12,2))
>> > if @prov=''
>> > begin
>> > insert into dtabla select cod3provee,codarticul,descripcio,0 as
>> > guia,costo3,precvendol,0 as total
>> > from bdcho.dbo.invmatpr where coidtalm = '10'
>> > end
>> > else
>> > begin
>> > insert into dtabla select cod3provee,codarticul,descripcio,0 as
>> > guia,costo3,precvendol,0 as total
>> > from bdcho.dbo.invmatpr where coidtalm = '10' and cod3provee=@prov
>> > end
>> > declare bdatos cursor for select nombre from maestro.dbo.openbd
>> > where
>> > based !=9
>> > open bdatos
>> > fetch next from bdatos into @nbd
>> > while @@fetch_status = 0
>> > begin
>> > set @campo = @nbd
>> > set @ejecuta = 'alter table dtabla add '+@campo+' decimal(12,2)
>> > default
>> > 0
>> > not null'
>> > exec (@ejecuta)
>> > if @prov=''
>> > begin
>> > set @ejecxtie = 'declare ventas cursor for select
>> > codarticul,sum(cantidad) as cantidad from '+@campo+
>> > '.dbo.archtra3 where fecha between '+''''+@mes1+''''+' and
>> > '+''''+@mes2+''''+
>> > ' and coidtalm='+''''+@alm+''''+' group by codarticul'
>> > end
>> > else
>> > begin
>> > set @ejecxtie = 'declare ventas cursor for select
>> > codarticul,sum(cantidad) as cantidad from '+@campo+
>> > '.dbo.archtra3 where fecha between '+''''+@mes1+''''+' and
>> > '+''''+@mes2+''''+
>> > ' and coidtalm='+''''+@alm+''''+' and
>> > proveedor='+''''+@prov+''''+'
>> > group by codarticul'
>> > end
>> > exec (@ejecxtie)
>> >
>> > open ventas
>> > fetch next from ventas into @vcodigo,@vcantidad
>> > while @@fetch_status = 0
>> > begin
>> > set @ejecxbd = 'update dtabla set guia = 1, '+@campo+' >> >> > '+cast(@vcantidad as
>> > varchar(15))+',vtatotal=vtatotal+'+cast(@vcantidad
>> > as
>> > varchar(15))+
>> > ' where codigo='+''''+@vcodigo+''''
>> > exec (@ejecxbd)
>> > fetch next from ventas into @vcodigo,@vcantidad
>> > end
>> > deallocate ventas
>> > fetch next from bdatos into @nbd
>> > end
>> > deallocate bdatos
>> > alter table dtabla add totalc decimal (12,2) default 0 not null
>> > alter table dtabla add totalp decimal (12,2) default 0 not null
>> > update dtabla set totalc = costo*vtatotal,totalp = publico*vtatotal
>> > if @modo=0
>> > begin
>> > select * from dtabla
>> > end
>> > else
>> > begin
>> > select * from dtabla where guia = 1
>> > end
>> > drop table dtabla
>> >
>> >
>> > Att
>> > Luis Mata Figueroa
>> > Área Informática
>> > Centro Cerámico Las Flores SAC
>> > RPC: 993597297
>> > TEL: 6174613
>> >
>> >
>> > "Gux (MVP)" escribió en el
>> > mensaje
>> > news:
>> >> Ayudaría mucho si usted muestra el procedimiento ventas_tiendas_all
>> >> o
>> >> por
>> >> favor muestre la línea 13, para que no estemos adivinando.
>> >>
>> >> Gustavo Larriera, Microsoft MVP
>> >> https://mvp.support.microsoft.com/p...o.larriera
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida