Mostrar BD segun tablas que contenga

14/06/2006 - 21:46 por Matías | Informe spam
Hola a todos, el tema es que me hace falta saber que bases de un
determinados servidor poseen ciertas tablas,
esto me hace falta porque mi aplicacion se conectara a distantas bases(estas
bases tendran la misma estructura pero distintos datos)
y tengo que mostrar las bases disponibles para que el usuario al entrar
seleccione una.
Probe con: Select RTRIM(Name) AS Name From SYSDATABASES
que me trae los nobres de las BD, pero ahora como hago para saber si cada
una contiene las tablas que me interesa.
Uso SQL2000 SP3

Muchas gracias por su valioso tiempo.

Preguntas similare

Leer las respuestas

#1 Matias Espinoza
14/06/2006 - 22:03 | Informe spam
SELECT *
FROM SYSOBJECTS
WHERE TYPE='U'

"Matías" escribió en el mensaje
news:uEXILt%
Hola a todos, el tema es que me hace falta saber que bases de un
determinados servidor poseen ciertas tablas,
esto me hace falta porque mi aplicacion se conectara a distantas


bases(estas
bases tendran la misma estructura pero distintos datos)
y tengo que mostrar las bases disponibles para que el usuario al entrar
seleccione una.
Probe con: Select RTRIM(Name) AS Name From SYSDATABASES
que me trae los nobres de las BD, pero ahora como hago para saber si cada
una contiene las tablas que me interesa.
Uso SQL2000 SP3

Muchas gracias por su valioso tiempo.


Respuesta Responder a este mensaje
#2 Alejandro Mesa
14/06/2006 - 22:19 | Informe spam
Matías,

Tambien puedes usar la vista INFORMATION_SCHEMA.TABLES.

Ejemplo:

use northwind
go

select TABLE_NAME
from INFORMATION_SCHEMA.TABLES
where TABLE_TYPE = 'BASE TABLE'


AMB


"Matías" wrote:

Hola a todos, el tema es que me hace falta saber que bases de un
determinados servidor poseen ciertas tablas,
esto me hace falta porque mi aplicacion se conectara a distantas bases(estas
bases tendran la misma estructura pero distintos datos)
y tengo que mostrar las bases disponibles para que el usuario al entrar
seleccione una.
Probe con: Select RTRIM(Name) AS Name From SYSDATABASES
que me trae los nobres de las BD, pero ahora como hago para saber si cada
una contiene las tablas que me interesa.
Uso SQL2000 SP3

Muchas gracias por su valioso tiempo.



Respuesta Responder a este mensaje
#3 Matías
14/06/2006 - 22:33 | Informe spam
Gracias, pero el tema es como hago para recorrer todas las bases, y solo
mostrar las que tengan ciertas tablas.
Se puede hacer "USE @BASE", donde @BASE es una variable q contiene el nombre
de la BD ?.
Estoy intentando con algo asi(meter una tabla temp. todos los nombres de las
BDs, recorrer esta tabla, hacer un USE por cada base y luego hacer el select
a INFORMATION_SCHEMA.TABLES, si dio algun valor insertarlo en otra tabla
tepm.):

BEGIN
CREATE TABLE #BULCLE (Base VARCHAR(50))
INSERT INTO #BULCLE
Select RTRIM(Name) AS Name From SYSDATABASES Order By DBId
IF @@ROWCOUNT = 0
BEGIN
SELECT 'Error, Al construir la lista de bases de datos'
END
DECLARE @NomBase as VARCHAR(50)
WHILE EXISTS (SELECT Base FROM #BULCLE)
BEGIN
SELECT TOP 1 @NomBase = Base FROM #BULCLE
IF @@ROWCOUNT = 0
BREAK
use @NomBase -- *** AQUI ME EXPLOTA ****
select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE 'MI_TABLA'
DELETE #BULCLE WHERE @NomBase = Base
CONTINUE
END
END
Respuesta Responder a este mensaje
#4 Alejandro Mesa
15/06/2006 - 14:20 | Informe spam
Matías,

No se puede usar una variable con la sentencis "use". En este caso puedes
usar sql dinamico y ejecutar un script, que haga la busqueda deseada, dentro
del contexto de la llamada, pues en cuanto se retorne el control a la rutina
que llama, la base de datos en uso sera la corriente a la hora de la llamada.

Ejemplo:

create table #t1 (
dbname sysname
)

declare @exists tinyint
declare @tn sysname
declare @sql nvarchar(4000)
declare @db_name sysname
declare db_cursor cursor
local
fast_forward
for
select
[name]
from
sysdatabases
where
[name] not in ('master', 'tempdb', 'model', 'msdb')

set @tn = N'orders'

open db_cursor

while 1 = 1
begin
fetch next from db_cursor into @db_name

if @@error != 0 or @@fetch_status != 0 break

set @sql = N'use [' + @db_name + N']; if exists(select * from
INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = ''dbo'' and TABLE_NAME = '''
+ @tn + N''' and TABLE_TYPE = ''BASE TABLE'') set @exists = 1'

set @exists = 0

exec sp_executesql @sql, N'@exists tinyint output', @exists output

if @exists = 1 insert into #t1 values(@db_name)
end

close db_cursor
deallocate db_cursor

select * from #t1

drop table #t1
go


AMB

"Matías" wrote:

Gracias, pero el tema es como hago para recorrer todas las bases, y solo
mostrar las que tengan ciertas tablas.
Se puede hacer "USE @BASE", donde @BASE es una variable q contiene el nombre
de la BD ?.
Estoy intentando con algo asi(meter una tabla temp. todos los nombres de las
BDs, recorrer esta tabla, hacer un USE por cada base y luego hacer el select
a INFORMATION_SCHEMA.TABLES, si dio algun valor insertarlo en otra tabla
tepm.):

BEGIN
CREATE TABLE #BULCLE (Base VARCHAR(50))
INSERT INTO #BULCLE
Select RTRIM(Name) AS Name From SYSDATABASES Order By DBId
IF @@ROWCOUNT = 0
BEGIN
SELECT 'Error, Al construir la lista de bases de datos'
END
DECLARE @NomBase as VARCHAR(50)
WHILE EXISTS (SELECT Base FROM #BULCLE)
BEGIN
SELECT TOP 1 @NomBase = Base FROM #BULCLE
IF @@ROWCOUNT = 0
BREAK
use @NomBase -- *** AQUI ME EXPLOTA ****
select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE > 'MI_TABLA'
DELETE #BULCLE WHERE @NomBase = Base
CONTINUE
END
END



Respuesta Responder a este mensaje
#5 Matías
15/06/2006 - 16:47 | Informe spam
OK, GRACIAS, funciona de 10, lu unico que es un poco lerdo, (15 a 20
segundos), pero lo probe en un servidor que tiene 18 BD, y la mayoria de las
BD tienen mas de 900 tablas.

"Alejandro Mesa" escribió en el
mensaje news:
Matías,

No se puede usar una variable con la sentencis "use". En este caso puedes
usar sql dinamico y ejecutar un script, que haga la busqueda deseada,


dentro
del contexto de la llamada, pues en cuanto se retorne el control a la


rutina
que llama, la base de datos en uso sera la corriente a la hora de la


llamada.

Ejemplo:

create table #t1 (
dbname sysname
)

declare @exists tinyint
declare @tn sysname
declare @sql nvarchar(4000)
declare @db_name sysname
declare db_cursor cursor
local
fast_forward
for
select
[name]
from
sysdatabases
where
[name] not in ('master', 'tempdb', 'model', 'msdb')

set @tn = N'orders'

open db_cursor

while 1 = 1
begin
fetch next from db_cursor into @db_name

if @@error != 0 or @@fetch_status != 0 break

set @sql = N'use [' + @db_name + N']; if exists(select * from
INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = ''dbo'' and TABLE_NAME '''
+ @tn + N''' and TABLE_TYPE = ''BASE TABLE'') set @exists = 1'

set @exists = 0

exec sp_executesql @sql, N'@exists tinyint output', @exists output

if @exists = 1 insert into #t1 values(@db_name)
end

close db_cursor
deallocate db_cursor

select * from #t1

drop table #t1
go


AMB

"Matías" wrote:

> Gracias, pero el tema es como hago para recorrer todas las bases, y solo
> mostrar las que tengan ciertas tablas.
> Se puede hacer "USE @BASE", donde @BASE es una variable q contiene el


nombre
> de la BD ?.
> Estoy intentando con algo asi(meter una tabla temp. todos los nombres de


las
> BDs, recorrer esta tabla, hacer un USE por cada base y luego hacer el


select
> a INFORMATION_SCHEMA.TABLES, si dio algun valor insertarlo en otra tabla
> tepm.):
>
> BEGIN
> CREATE TABLE #BULCLE (Base VARCHAR(50))
> INSERT INTO #BULCLE
> Select RTRIM(Name) AS Name From SYSDATABASES Order By DBId
> IF @@ROWCOUNT = 0
> BEGIN
> SELECT 'Error, Al construir la lista de bases de datos'
> END
> DECLARE @NomBase as VARCHAR(50)
> WHILE EXISTS (SELECT Base FROM #BULCLE)
> BEGIN
> SELECT TOP 1 @NomBase = Base FROM #BULCLE
> IF @@ROWCOUNT = 0
> BREAK
> use @NomBase -- *** AQUI ME EXPLOTA ****
> select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE > > 'MI_TABLA'
> DELETE #BULCLE WHERE @NomBase = Base
> CONTINUE
> END
> END
>
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida