Ayuda con sysobjects

10/09/2004 - 01:00 por wandoo | Informe spam
Estoy tratando de sacar lo Stored Procedures de mi db pero
mi consulta me saca los del sistema y los de usuario como
los diferencia.

Esta es mi consulta

SELECT name
FROM sysobjects
WHERE (xtype = 'p')

Mil gracias

Preguntas similare

Leer las respuestas

#1 MAXI
10/09/2004 - 02:53 | Informe spam
Hola, y estas haciendo la consulta en la BDD propiamente dicha o en la
master ?




Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)
Mail: Maxi_accotto[arroba]speedy.com.ar
Msn Messager:

"wandoo" escribió en el mensaje
news:934201c496c0$d9945240$
Estoy tratando de sacar lo Stored Procedures de mi db pero
mi consulta me saca los del sistema y los de usuario como
los diferencia.

Esta es mi consulta

SELECT name
FROM sysobjects
WHERE (xtype = 'p')

Mil gracias
Respuesta Responder a este mensaje
#2 Javier Loria
10/09/2004 - 06:22 | Informe spam
Hola:
Algo como:
==SELECT name
FROM sysobjects
WHERE xtype='P'
AND OBJECTPROPERTY(id,'IsMSShipped')=1
== Este debe darte los de sistema y en 0 los de usuario. En general es mala
practica usar codigo contra las tablas de sistema cuando quedan en la
aplicacion ya que luego se producen problemas de compatibilidad con las
nuevas versiones.

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

"wandoo" wrote in message
news:934201c496c0$d9945240$
Estoy tratando de sacar lo Stored Procedures de mi db pero
mi consulta me saca los del sistema y los de usuario como
los diferencia.

Esta es mi consulta

SELECT name
FROM sysobjects
WHERE (xtype = 'p')

Mil gracias
Respuesta Responder a este mensaje
#3 ulises
10/09/2004 - 08:59 | Informe spam
Complementando lo indicado por Javier, la información sobre si se
trata de un objeto del sistema se guarda en la columna status, si se
revisa el procedimiento sp_MS_marksystemobject verás que para marcar
un objeto como del sistema lo que hace es lo siguiente :

update sysobjects set status = status | 0xC0000000

en resumen convierte el entero a su presentación binaria y coloca 1 en
los bits 31 y 32, de esta manera si extraemos el byte más a la derecha
del campo status (de los 4 que tiene) siempre será mayor a 0xC0 o en
decimal a 192. De esta manera para extraer los procedimientos
almacenados de usuario sería con :

select *
from sysobjects
where xtype = 'P'
and convert(int,substring(convert(binary(4),status),1,1)) < 192

ahora bien, esto lo he probado en las bases de datos de usuario y veo
que me da la información correcta, pero lo probé en las bases de datos
master y msdb y veo con sorpresa que no obtiene los resultados
esperados, en msdb obtengo que los valores marcados como del sistema
tienen el valor 160, es decir tienen el bit 32 en uno y el bit 31 en
cero.

select name, convert(int,substring(convert(binary(4),status),1,1))
from sysobjects
where xtype = 'P'

name
sp_set_sqlagent_properties 32
sp_sqlagent_has_server_access 160
sp_verify_subsystem 160
r_iRTblTFMProps 96
...

haciendo la prueba de cambiar el status de un procedimiento colocando
solo 1 en el bit 32 o que es lo mismo que hacer un OR con el binario
10000000 (ó 0x80 o 192)

create proc pruebaproc
as
select * from authors
go
update sysobjects set status = status | 0x80000000 where name 'pruebaproc'
go
select name from sysobjects
where name = 'pruebaproc' AND OBJECTPROPERTY(id,'IsMSShipped')=1
go

resultado :

name
-
pruebaproc

(1 row(s) affected)

por lo que solo es necesario cambiar el bit 32 a 1 para que sea
marcado como un objeto del sistema (porqué el procedimiento
sp_MS_marksystemobject hace otra cosa es algo que me gustaría saber).

De esta manera la sentencia

select *
from sysobjects
where xtype = 'P'
and convert(int,substring(convert(binary(4),status),1,1)) < 128

sería similar a :

select *
from sysobjects
where xtype = 'P' and OBJECTPROPERTY(id,'IsMSShipped')=0

Ojo que también pienso que es mala idea manipular directamente las
tablas del sistema pero siempre es bueno conocer las tablas por
dentro.

Saludos,
Ulises
PD. Espero no haberme equivocado, considerando que son casi las 2 de
la mañana en Lima y que no estoy de buen humor ya que los Colts
perdieron ...

On Thu, 9 Sep 2004 23:22:28 -0500, "Javier Loria"
wrote:

Hola:
Algo como:
==>SELECT name
FROM sysobjects
WHERE xtype='P'
AND OBJECTPROPERTY(id,'IsMSShipped')=1
==> Este debe darte los de sistema y en 0 los de usuario. En general es mala
practica usar codigo contra las tablas de sistema cuando quedan en la
aplicacion ya que luego se producen problemas de compatibilidad con las
nuevas versiones.

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida