Una consultilla sobre cursores??

02/02/2005 - 13:19 por Sole | Informe spam
Tengo este codigo...

WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT @NombreVista
EXEC sp_refreshview @NombreVista
FETCH NEXT FROM VistasUser_Cursor INTO @NombreVista
END

EL problema que tengo es que a veces tengo vistas creadas con tablas que ya
no existen, entonces a la hora de refrescar las vistas me da error y no me
sigue, como puedo controlarlo???

Muchas gracias por leerme :)

Preguntas similare

Leer las respuestas

#1 Tinoco
02/02/2005 - 14:41 | Informe spam
Hola Sole,

Por ahora la solucion que veo es, revisar antes de ejecutar el
sp_refreshview si existen las tablas, algo como:

If Exists (Select 1 from dbo.sysobjects where id =
object_id(N'tblVerificar') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
Exec sp_refreshview

Espero que esto te sirva.

Hermilson Tinoco

"Sole" wrote:

Tengo este codigo...

WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT @NombreVista
EXEC sp_refreshview @NombreVista
FETCH NEXT FROM VistasUser_Cursor INTO @NombreVista
END

EL problema que tengo es que a veces tengo vistas creadas con tablas que ya
no existen, entonces a la hora de refrescar las vistas me da error y no me
sigue, como puedo controlarlo???

Muchas gracias por leerme :)



Respuesta Responder a este mensaje
#2 Sole
02/02/2005 - 15:57 | Informe spam
Gracias Hermilson por contestar, pero de esa manera necesito saber que
tablas están dentro de la view, quería hacerlo de una forma automática pero
veo que no se puede hacer, este problema en producción no debería suceder
pero veo que en desarrollo si sucede por temas de pruebas. Muchas gracias de
nuevo.

"Tinoco" escribió en el mensaje
news:
Hola Sole,

Por ahora la solucion que veo es, revisar antes de ejecutar el
sp_refreshview si existen las tablas, algo como:

If Exists (Select 1 from dbo.sysobjects where id > object_id(N'tblVerificar') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
Exec sp_refreshview

Espero que esto te sirva.

Hermilson Tinoco

"Sole" wrote:

Tengo este codigo...

WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT @NombreVista
EXEC sp_refreshview @NombreVista
FETCH NEXT FROM VistasUser_Cursor INTO @NombreVista
END

EL problema que tengo es que a veces tengo vistas creadas con tablas que
ya
no existen, entonces a la hora de refrescar las vistas me da error y no
me
sigue, como puedo controlarlo???

Muchas gracias por leerme :)



Respuesta Responder a este mensaje
#3 Alejandro Mesa
02/02/2005 - 16:37 | Informe spam
Hola Sole,

Dos cosas se pueden hacer, una para evitar el error y la otra es para
prevenir que vuelva a suceder.

Para que tu script no se rompa, puedes hacer una consulta de la vista usando
otro contexto, osea, usando el procedimiento sp_executesql y revisando el
error devuelto, si es 4413 entonces hay problema con objetos referenciados en
la vista, puedes consultar este error desde la tabla de systema
master..sysmessages donde error = 4413.


declare @sql nvarchar(4000)
declare @rv int

...

WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT @NombreVista

set @sql = N'select * from ' + quotename(@NombreVista) + N' where 0 = 1'

execute @rv = sp_executesql @sql

if @rv = 0
EXEC sp_refreshview @NombreVista
else
begin
print @rv
print 'hubo problemas con la vista'
end

FETCH NEXT FROM VistasUser_Cursor INTO @NombreVista
END


Para evitar que esto vuelva a suceder, usa el atributo schemabinding, cuando
crees la vista. De esta manera nadie podra borrar (drop) ningun objeto
referenciado por la vista sin antes modificar la vista o borrarla.

Ejemplo:

create table t (colA int)
go

create view myview
with schemabinding
as
select
colA
from
dbo.t
go

drop table t
go

drop view myview
go

drop table t
go


AMB

"Sole" wrote:

Gracias Hermilson por contestar, pero de esa manera necesito saber que
tablas están dentro de la view, quería hacerlo de una forma automática pero
veo que no se puede hacer, este problema en producción no debería suceder
pero veo que en desarrollo si sucede por temas de pruebas. Muchas gracias de
nuevo.

"Tinoco" escribió en el mensaje
news:
> Hola Sole,
>
> Por ahora la solucion que veo es, revisar antes de ejecutar el
> sp_refreshview si existen las tablas, algo como:
>
> If Exists (Select 1 from dbo.sysobjects where id > > object_id(N'tblVerificar') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
> Exec sp_refreshview
>
> Espero que esto te sirva.
>
> Hermilson Tinoco
>
> "Sole" wrote:
>
>> Tengo este codigo...
>>
>> WHILE (@@FETCH_STATUS = 0)
>> BEGIN
>> PRINT @NombreVista
>> EXEC sp_refreshview @NombreVista
>> FETCH NEXT FROM VistasUser_Cursor INTO @NombreVista
>> END
>>
>> EL problema que tengo es que a veces tengo vistas creadas con tablas que
>> ya
>> no existen, entonces a la hora de refrescar las vistas me da error y no
>> me
>> sigue, como puedo controlarlo???
>>
>> Muchas gracias por leerme :)
>>
>>
>>



Respuesta Responder a este mensaje
#4 Sole
02/02/2005 - 17:17 | Informe spam
Genial Alejandro!!! muchas gracias, si le quito el quotename me funciona
perfecto. Sobre lo del schemabinding sin comentarios, se evitarían estos
problemas, muchas gracias

"Alejandro Mesa" escribió en el
mensaje news:
Hola Sole,

Dos cosas se pueden hacer, una para evitar el error y la otra es para
prevenir que vuelva a suceder.

Para que tu script no se rompa, puedes hacer una consulta de la vista
usando
otro contexto, osea, usando el procedimiento sp_executesql y revisando el
error devuelto, si es 4413 entonces hay problema con objetos referenciados
en
la vista, puedes consultar este error desde la tabla de systema
master..sysmessages donde error = 4413.


declare @sql nvarchar(4000)
declare @rv int

...

WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT @NombreVista

set @sql = N'select * from ' + quotename(@NombreVista) + N' where 0 = 1'

execute @rv = sp_executesql @sql

if @rv = 0
EXEC sp_refreshview @NombreVista
else
begin
print @rv
print 'hubo problemas con la vista'
end

FETCH NEXT FROM VistasUser_Cursor INTO @NombreVista
END


Para evitar que esto vuelva a suceder, usa el atributo schemabinding,
cuando
crees la vista. De esta manera nadie podra borrar (drop) ningun objeto
referenciado por la vista sin antes modificar la vista o borrarla.

Ejemplo:

create table t (colA int)
go

create view myview
with schemabinding
as
select
colA
from
dbo.t
go

drop table t
go

drop view myview
go

drop table t
go


AMB

"Sole" wrote:

Gracias Hermilson por contestar, pero de esa manera necesito saber que
tablas están dentro de la view, quería hacerlo de una forma automática
pero
veo que no se puede hacer, este problema en producción no debería suceder
pero veo que en desarrollo si sucede por temas de pruebas. Muchas gracias
de
nuevo.

"Tinoco" escribió en el mensaje
news:
> Hola Sole,
>
> Por ahora la solucion que veo es, revisar antes de ejecutar el
> sp_refreshview si existen las tablas, algo como:
>
> If Exists (Select 1 from dbo.sysobjects where id >> > object_id(N'tblVerificar') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
> Exec sp_refreshview
>
> Espero que esto te sirva.
>
> Hermilson Tinoco
>
> "Sole" wrote:
>
>> Tengo este codigo...
>>
>> WHILE (@@FETCH_STATUS = 0)
>> BEGIN
>> PRINT @NombreVista
>> EXEC sp_refreshview @NombreVista
>> FETCH NEXT FROM VistasUser_Cursor INTO @NombreVista
>> END
>>
>> EL problema que tengo es que a veces tengo vistas creadas con tablas
>> que
>> ya
>> no existen, entonces a la hora de refrescar las vistas me da error y
>> no
>> me
>> sigue, como puedo controlarlo???
>>
>> Muchas gracias por leerme :)
>>
>>
>>



Respuesta Responder a este mensaje
#5 Alejandro Mesa
02/02/2005 - 17:47 | Informe spam
muchas gracias



No hay de que.

No se que pasa con QUOTENAME. Se deberia usar esta funcion en estos casos
para evitar errores cuando el objeto usa palabras reservadas o tiene espacios
en su nombre. Si no especificas el caracter que vas a usar para encerrar el
nombre, sql server usa "[]" como default. Una solucion podria ser adicionar
el caracter que vas a usar para encerrar el nombre de la vista, como por
ejemplo doble comilla " (solo puede ser comilla simple, doble comilla o los
[]). Si usamos double comilla, entonces hay que decirle a sql server que los
identificadores (nombre de tablas, vistas, etc.) delimitados con doble
comilla pueden ser palabras reservadas o pueden contener caracteres no
permitidos usualmente en las reglas de sintaxi para identificadores:

Ejemplo:

use northwind
go

declare @sql nvarchar(4000)
declare @nombrevista sysname

set @nombrevista = 'Summary of Sales by Quarter'
set @sql = N'SET QUOTED_IDENTIFIER ON' + nchar(13) + N'select * from ' +
quotename(@nombrevista, '"') + N' where 0 = 1'

print @sql
execute sp_executesql @sql
go


AMB

"Sole" wrote:

Genial Alejandro!!! muchas gracias, si le quito el quotename me funciona
perfecto. Sobre lo del schemabinding sin comentarios, se evitarían estos
problemas, muchas gracias

"Alejandro Mesa" escribió en el
mensaje news:
> Hola Sole,
>
> Dos cosas se pueden hacer, una para evitar el error y la otra es para
> prevenir que vuelva a suceder.
>
> Para que tu script no se rompa, puedes hacer una consulta de la vista
> usando
> otro contexto, osea, usando el procedimiento sp_executesql y revisando el
> error devuelto, si es 4413 entonces hay problema con objetos referenciados
> en
> la vista, puedes consultar este error desde la tabla de systema
> master..sysmessages donde error = 4413.
>
>
> declare @sql nvarchar(4000)
> declare @rv int
>
> ...
>
> WHILE (@@FETCH_STATUS = 0)
> BEGIN
> PRINT @NombreVista
>
> set @sql = N'select * from ' + quotename(@NombreVista) + N' where 0 = 1'
>
> execute @rv = sp_executesql @sql
>
> if @rv = 0
> EXEC sp_refreshview @NombreVista
> else
> begin
> print @rv
> print 'hubo problemas con la vista'
> end
>
> FETCH NEXT FROM VistasUser_Cursor INTO @NombreVista
> END
>
>
> Para evitar que esto vuelva a suceder, usa el atributo schemabinding,
> cuando
> crees la vista. De esta manera nadie podra borrar (drop) ningun objeto
> referenciado por la vista sin antes modificar la vista o borrarla.
>
> Ejemplo:
>
> create table t (colA int)
> go
>
> create view myview
> with schemabinding
> as
> select
> colA
> from
> dbo.t
> go
>
> drop table t
> go
>
> drop view myview
> go
>
> drop table t
> go
>
>
> AMB
>
> "Sole" wrote:
>
>> Gracias Hermilson por contestar, pero de esa manera necesito saber que
>> tablas están dentro de la view, quería hacerlo de una forma automática
>> pero
>> veo que no se puede hacer, este problema en producción no debería suceder
>> pero veo que en desarrollo si sucede por temas de pruebas. Muchas gracias
>> de
>> nuevo.
>>
>> "Tinoco" escribió en el mensaje
>> news:
>> > Hola Sole,
>> >
>> > Por ahora la solucion que veo es, revisar antes de ejecutar el
>> > sp_refreshview si existen las tablas, algo como:
>> >
>> > If Exists (Select 1 from dbo.sysobjects where id > >> > object_id(N'tblVerificar') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
>> > Exec sp_refreshview
>> >
>> > Espero que esto te sirva.
>> >
>> > Hermilson Tinoco
>> >
>> > "Sole" wrote:
>> >
>> >> Tengo este codigo...
>> >>
>> >> WHILE (@@FETCH_STATUS = 0)
>> >> BEGIN
>> >> PRINT @NombreVista
>> >> EXEC sp_refreshview @NombreVista
>> >> FETCH NEXT FROM VistasUser_Cursor INTO @NombreVista
>> >> END
>> >>
>> >> EL problema que tengo es que a veces tengo vistas creadas con tablas
>> >> que
>> >> ya
>> >> no existen, entonces a la hora de refrescar las vistas me da error y
>> >> no
>> >> me
>> >> sigue, como puedo controlarlo???
>> >>
>> >> Muchas gracias por leerme :)
>> >>
>> >>
>> >>
>>
>>
>>



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida