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

#6 Sole
02/02/2005 - 18:22 | Informe spam
Gracias de nuevo Alejandro por la aclaración, pues no sé de que puede ser...

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





en @NombreVista le llega formada la cadena 'User+NombreView', por ejemplo
'sole.NombreVista', y estoy en sql server 7.



"Alejandro Mesa" escribió en el
mensaje news:
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
#7 Alejandro Mesa
02/02/2005 - 18:41 | Informe spam
Sole,

Eso biene de la declaracion del cursor, esta trayendo el duenio del objeto
junto con el nombre. Una posible solucion en este caso es usar la function
PARSENAME.

Ejemplo:

use northwind
go

declare @v sysname
declare @sql nvarchar(4000)

set @v = 'dbo.Summary of Sales by Quarter'
set @sql = N'select * from ' + quotename(parsename(@v, 2)) + '.' +
quotename(parsename(@v, 1)) + N' where 0 = 1'

execute sp_executesql @sql
go


AMB


"Sole" wrote:

Gracias de nuevo Alejandro por la aclaración, pues no sé de que puede ser...

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

en @NombreVista le llega formada la cadena 'User+NombreView', por ejemplo
'sole.NombreVista', y estoy en sql server 7.



"Alejandro Mesa" escribió en el
mensaje news:
>> 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
#8 Sole
03/02/2005 - 10:23 | Informe spam
Ha quedado perfecto, muchas gracias por las molestias Alejandro, de un
detallito he aprendido bastantes cosas :), este foro no tiene precio.


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

Eso biene de la declaracion del cursor, esta trayendo el duenio del objeto
junto con el nombre. Una posible solucion en este caso es usar la function
PARSENAME.

Ejemplo:

use northwind
go

declare @v sysname
declare @sql nvarchar(4000)

set @v = 'dbo.Summary of Sales by Quarter'
set @sql = N'select * from ' + quotename(parsename(@v, 2)) + '.' +
quotename(parsename(@v, 1)) + N' where 0 = 1'

execute sp_executesql @sql
go


AMB


"Sole" wrote:

Gracias de nuevo Alejandro por la aclaración, pues no sé de que puede
ser...

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

en @NombreVista le llega formada la cadena 'User+NombreView', por ejemplo
'sole.NombreVista', y estoy en sql server 7.



"Alejandro Mesa" escribió en el
mensaje news:
>> 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 :)
>> >> >>
>> >> >>
>> >> >>
>> >>
>> >>
>> >>
>>
>>
>>



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida