2009-08-04 17 views

Respuesta

4

Portátil? No lo creo.

Tal vez el más cercano que puedes conseguir es:

select * from <table> 

y esto devolverá un error si la tabla no existe.

+0

Aye Alan, esa es la conclusión a la que llegué. ¡Cojo! – jkp

4

Esto es tan portátil como se pone, por desgracia:

select 
    count(*) 
from 
    information_schema.tables 
where 
    table_name = 'tablename' 
    and table_schema = 'dbo' 

Esto definitivamente funciona en SQL Server, MySQL y Postgres. No tanto en Oracle, sin embargo. Tendría que acceder al diccionario de datos de Oracle para eso. Sin embargo, hay un proyecto de código abierto que creates information_schema in Oracle del diccionario de datos. Puede intentar eso si necesita una portabilidad absoluta.

P.S.-Schema no tiene que ser dbo, pero ese es el más común.

+0

no se olvide de comprobar el esquema también. dbo.tablename y MySchema.tablename podrían existir ambos. –

0

Como cada DBMS tiene su propia metabase, creo que la forma más "portátil" de hacerlo es usar la misma persona que llama la aplicación. Algo como

try 
    execute("select top 1 * from table") 
    return (true) 
catch 
    return false 
+2

No estoy seguro de que 'top' sea portable. – jkp

+0

bueno, si incluso la parte superior 1 no es lo suficientemente portátil, simplemente use select * – Rodrigo

+0

'try ... catch' definitivamente no es portable –

0

Intenta consultar la tabla. Si la consulta falla, se obtiene un error, no existe.

Eso es probablemente tan portátil como puedas conseguir. La carga de producir el resultado depende del código que consulta la tabla/base de datos.

select top 1 * 
from MyTable 

Mantenga la consulta lo más simple posible para evitar otros posibles errores.

1

Las vistas INFORMATION_SCHEMA son estándar ANSI, por lo que esa debería ser su opción más portátil. No se olvide de añadir el tipo de esquema y la tabla a la cláusula where ...

if exists(select * 
      from information_schema.tables 
      where table_schema = 'dbo' 
        and table_name = 'MyTable' 
        and table_type = 'basetable') 
begin 
    -- your code here 
end 
1

Aquí es algo que es razonablemente portátil:

seleccione ahora() del límite de la tabla 1;

No se basa en el conocimiento de ninguna columna en particular.

No incurre en los gastos generales que el recuento (*) a veces tiene.

No importa si la tabla está vacía o no.

No funciona si la tabla no existe.

+0

No funciona con SQLServer – Toto

+0

' now() 'no es" portable ". 'current_timestamp' sería –

2

diría

select 'x' from <table_name> where 0=1;

El inconveniente es que si se produce un error, usted no sabe a ciencia cierta cuál fue la causa real. Es posible que le falte una tabla o, por ejemplo, un error de conexión. Puede analizar el mensaje de error, pero definitivamente no sería portátil.

Cuestiones relacionadas