¿Cómo puedo saber la relación que hay de unas tablas echas en base de datos SQLserver?
¿Cómo puedo saber la relación que hay de unas tablas echas en sqlserver? Es muy importante.
1 respuesta
Respuesta de smanero
1
1
¿Qué es lo que tu entiendes por "relación que hay de unas tablas hechas en sqlserver"? Te podré responder pero debes explicarte un poco mejor.
Entre tablas hay relaciones, es decir por ejemplo tengo la tabla cliente, ¿y la tabla población pues entre estas dos tabla hay un campo común que sera codpoblacion por ejemplo no? Pues eso es lo que quiero yo saber como sacar la relación entre las tablas que tengo en sql server.
Si sigues teniendo dudas pregunta
Gracias
Si sigues teniendo dudas pregunta
Gracias
La consulta que hay que ejecutar es:
-----------------------
select O1.NAME,C1.NAME,O2.name,C2.NAME
from sysobjects o1,sysobjects o2, syscolumns c1,syscolumns c2,
sysreferences r,sysconstraints s
where c1.id = O1.ID AND c2.id = O2.ID
AND o1.id = r.rkeyid AND o2.id = r.Fkeyid
AND r.rkeyid = s.id AND (s.status & 0xf) = 1
AND c1.colid*1000+C2.COLID IN
(R.RKEY1*1000+R.FKEY1,R.RKEY2*1000+R.FKEY2,R.RKEY3*1000+R.FKEY3,R.RKEY4*1000+R.FKEY4,
R.RKEY5*1000+R.FKEY5,R.RKEY6*1000+R.FKEY6,R.RKEY7*1000+R.FKEY7,R.RKEY8*1000+R.FKEY8)
-------------------------
¡Esto vale un potosí! Así que espero me lo agradezcas y te sirva.
-----------------------
select O1.NAME,C1.NAME,O2.name,C2.NAME
from sysobjects o1,sysobjects o2, syscolumns c1,syscolumns c2,
sysreferences r,sysconstraints s
where c1.id = O1.ID AND c2.id = O2.ID
AND o1.id = r.rkeyid AND o2.id = r.Fkeyid
AND r.rkeyid = s.id AND (s.status & 0xf) = 1
AND c1.colid*1000+C2.COLID IN
(R.RKEY1*1000+R.FKEY1,R.RKEY2*1000+R.FKEY2,R.RKEY3*1000+R.FKEY3,R.RKEY4*1000+R.FKEY4,
R.RKEY5*1000+R.FKEY5,R.RKEY6*1000+R.FKEY6,R.RKEY7*1000+R.FKEY7,R.RKEY8*1000+R.FKEY8)
-------------------------
¡Esto vale un potosí! Así que espero me lo agradezcas y te sirva.
¿La select que hay que hacer es la que tu me has puesto no? Pero 01. ¿name a que hace referencia? ¿Y c1.name? ¿Etc? ¿E de sustituir algo o simplemente copiarla y ejecutarla?
¿Estas seguro de que hace lo que yo pretendo? Es que parece que la veo muy compleja. ¿Sino te importa me la puedes explicar?
Gracias
¿Estas seguro de que hace lo que yo pretendo? Es que parece que la veo muy compleja. ¿Sino te importa me la puedes explicar?
Gracias
Copiar y ejecutar, sin más, como ves no te he preguntado ni por la versión, ¿explicártela?, pasé días para poder hacerla funcionar y de esto ya hace tiempo (más de un año) y tienes suerte de que la tuviera guardada, en realidad yo buscaba un consulta en dándole una tabla y me sacaba todas las relacionadas con ella.
Ejecutala y si tienes alguna duda me avisas.
Ejecutala y si tienes alguna duda me avisas.
Lo de la explicación venia porque yo lo necesito para unas tablas de una empresa y no me la puedo jugar así como así. Y ademas me gusta saber lo que hago. Gracias.
Está bien que no te fíes y te recomiendo que hagas todas las pruebas que estimes oprtunas, puedes comprobar que para una (o dos) tabla en particular funciona (se sabe mirando el script de la tabla, pero darte una explicación detallada me llevaría muchísimo tiempo, comprendelo.
Voy a hacer una prueba y ahora te comunico y te puntúo no te preocupes que no te quedaras sin puntuación funcione o no debido a que le estas poniendo mucho interés.
¿OK?
¿OK?
Me parece muy raro lo que me dices, si hay relaciones(FOREIGN KEY) las tendría que sacar. Haz esta consulta y me dices si te devuelve algo:
-----------
select * from sysobjects where type='f'
-----------
De todas formas para ver si las hay dime el nombre de las tablas que están relacionadas y los nombres de los campos que se relacionan. Dime los nombres reales para poder enviarte la consulta con la que debes probar.
-----------
select * from sysobjects where type='f'
-----------
De todas formas para ver si las hay dime el nombre de las tablas que están relacionadas y los nombres de los campos que se relacionan. Dime los nombres reales para poder enviarte la consulta con la que debes probar.
Te mando esta consulta, pero te advierto que el resultado puede que no sea el esperado:
---------------
select O1.NAME,C1.NAME,O2.name,C2.NAME
from sysobjects o1,sysobjects o2, syscolumns c1,syscolumns c2
where c1.id = O1.ID AND c2.id = O2.ID and o1.id<>o2.id
AND c1.name=c2.name and o1.type='U' and o2.type='U'
----------------------
Esta consulta te saca las parejas de tablas que tienen un campo que se llama igual, tiene un problema y es que si P.e. tu pones en las tablas un campo que se llama p.ej.:
Comentario o
ID etc...
Te las va a sacar aunque no tengan relación entre sí.
---------------
select O1.NAME,C1.NAME,O2.name,C2.NAME
from sysobjects o1,sysobjects o2, syscolumns c1,syscolumns c2
where c1.id = O1.ID AND c2.id = O2.ID and o1.id<>o2.id
AND c1.name=c2.name and o1.type='U' and o2.type='U'
----------------------
Esta consulta te saca las parejas de tablas que tienen un campo que se llama igual, tiene un problema y es que si P.e. tu pones en las tablas un campo que se llama p.ej.:
Comentario o
ID etc...
Te las va a sacar aunque no tengan relación entre sí.
La primera select que me has dicho que hiciera no me saca nada!
Y luego la segunda select y ultima es una bestialidad me salen como 120000 lineas me parece una burrada, ¿no?
Y luego la segunda select y ultima es una bestialidad me salen como 120000 lineas me parece una burrada, ¿no?
Si la consulta,
select * from sysobjects where type='f'
no te saca nada, es que al SQL no le has dicho las relaciones que tienes y por tanto mal te puede responder. Como ya me imaginaba ésto, te he mandado la 2ª pero como me dices que te salen tantos, lo mejor es que plantees realmente que es lo que quieres, de todas formas veo que esa BD está bastante mal administrada por el que la diseño (no te molestes con el comentario), ejecuta esta consulta a ver si reducimos , pero si nadie a metido enlaces externos entre tablas estás muy "jodido" ( y disculpa la expresión),
select Campo=b1.name,Tabla1=a1.name,Tabla2=a2.name
FROM SYSOBJECTS A1, SYSCOLUMNS B1, SYSTYPES C1,
SYSOBJECTS A2, SYSCOLUMNS B2, SYSTYPES C2
WHERE A1.ID= B1.ID AND A1.TYPE = 'U' AND C1.TYPE = B1.TYPE AND C1.NAME = 'sysname' and
A2.ID= B2.ID AND A2.TYPE = 'U' AND C2.TYPE = B2.TYPE AND C2.NAME = 'sysname'
AND a1.id<a2.id and b1.name=b2.name
and b1.name not in ('comentario','id','?????')
--¿Para limitar a ciertas tablas pon el código a1. Name like '%?%'
----------------------
Evidentemente te saldrán muchos registros, y tendrás que ser tú quien vaya discriminando.
select * from sysobjects where type='f'
no te saca nada, es que al SQL no le has dicho las relaciones que tienes y por tanto mal te puede responder. Como ya me imaginaba ésto, te he mandado la 2ª pero como me dices que te salen tantos, lo mejor es que plantees realmente que es lo que quieres, de todas formas veo que esa BD está bastante mal administrada por el que la diseño (no te molestes con el comentario), ejecuta esta consulta a ver si reducimos , pero si nadie a metido enlaces externos entre tablas estás muy "jodido" ( y disculpa la expresión),
select Campo=b1.name,Tabla1=a1.name,Tabla2=a2.name
FROM SYSOBJECTS A1, SYSCOLUMNS B1, SYSTYPES C1,
SYSOBJECTS A2, SYSCOLUMNS B2, SYSTYPES C2
WHERE A1.ID= B1.ID AND A1.TYPE = 'U' AND C1.TYPE = B1.TYPE AND C1.NAME = 'sysname' and
A2.ID= B2.ID AND A2.TYPE = 'U' AND C2.TYPE = B2.TYPE AND C2.NAME = 'sysname'
AND a1.id<a2.id and b1.name=b2.name
and b1.name not in ('comentario','id','?????')
--¿Para limitar a ciertas tablas pon el código a1. Name like '%?%'
----------------------
Evidentemente te saldrán muchos registros, y tendrás que ser tú quien vaya discriminando.
- Compartir respuesta
- Anónimo
ahora mismo