Me gustaría que esta sea la discusión final sobre cómo verificar si existe una tabla en SQL Server 2000/2005 utilizando declaraciones SQL.
Cuando buscas la respuesta en Google, obtienes tantas respuestas diferentes. ¿Hay una forma oficial / compatible con versiones anteriores y posteriores de hacerlo?
Aquí hay dos formas posibles de hacerlo. ¿Cuál de las dos es la mejor forma estándar de hacerlo?
Primera forma:
IF EXISTS (SELECT 1
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_NAME='mytablename')
SELECT 1 AS res ELSE SELECT 0 AS res;
Segunda forma:
IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL
SELECT 1 AS res ELSE SELECT 0 AS res;
MySQL proporciona lo simple
SHOW TABLES LIKE '%tablename%';
declaración. Estoy buscando algo similar
Respuestas:
Para consultas como esta, siempre es mejor usar una
INFORMATION_SCHEMA
vista. Estas vistas son (en su mayoría) estándar en muchas bases de datos diferentes y rara vez cambian de una versión a otra.Para verificar si existe una tabla, use:
fuente
SELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'
También tenga en cuenta que si por alguna razón necesita verificar una tabla temporal, puede hacer esto:
fuente
Siempre usamos el
OBJECT_ID
estilo por el tiempo que recuerdofuente
OBJECT_ID('TableName', 'U')
para garantizar que el objeto sea una tabla.IF EXISTS
consulta desde la respuesta aceptada una y otra vez. Además, todo es críptico hasta que lea la documentación, especialmente en T-SQL (o cualquier otra variante, en realidad).Por favor vea los siguientes enfoques,
Enfoque 1: Uso de la vista INFORMATION_SCHEMA.TABLES
Podemos escribir una consulta como la siguiente para verificar si existe una tabla de clientes en la base de datos actual.
Enfoque 2: uso de la función OBJECT_ID ()
Podemos usar la función OBJECT_ID () como a continuación para verificar si existe una tabla de clientes en la base de datos actual.
Enfoque 3: Uso de sys.Objects Catalog View
Podemos usar la vista de catálogo Sys.Objects para verificar la existencia de la Tabla como se muestra a continuación:
Enfoque 4: Uso de sys. Tablas Vista de catálogo
Podemos usar la vista de catálogo Sys.Tables para verificar la existencia de la tabla como se muestra a continuación:
Enfoque 5: Evite usar la tabla del sistema sys.sysobjects
Deberíamos evitar el uso de la tabla del sistema sys.sysobjects directamente, el acceso directo a él quedará obsoleto en algunas versiones futuras del servidor SQL. Según el enlace de Microsoft BOL, Microsoft sugiere utilizar las vistas de catálogo sys.objects / sys.tables en lugar de la tabla del sistema sys.sysobjects directamente.
referido de: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
fuente
Buscando una tabla en una base de datos diferente:
fuente
Solo quería mencionar una situación en la que probablemente sería un poco más fácil usar el
OBJECT_ID
método. LasINFORMATION_SCHEMA
vistas son objetos debajo de cada base de datos.https://msdn.microsoft.com/en-us/library/ms186778.aspx
Por lo tanto, todas las tablas a las que accede utilizando
solo reflejará lo que hay adentro
[database]
. Si desea verificar si existen tablas en otra base de datos, sin cambiar dinámicamente[database]
cada vez,OBJECT_ID
le permitirá hacer esto de forma inmediata. Ex-funciona tan bien como
SQL SERVER 2016 Edit :
A partir de 2016, Microsoft simplificó la capacidad de verificar objetos inexistentes antes de colocarlos, agregando las
if exists
palabras clave a lasdrop
declaraciones. Por ejemplo,hará lo mismo que
OBJECT_ID
/INFORMATION_SCHEMA
wrappers, en 1 línea de código.https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/
fuente
fuente
El uso del esquema de información es la forma estándar de SQL para hacerlo, por lo que debe ser utilizado por todas las bases de datos que lo admiten.
fuente
Aquí en el código anterior, el nombre de la tabla es
Mapping_APCToFANavigator
.fuente
{ }
) en la barra de herramientas de editor de formato y la sintaxis muy bien resáltala!Si necesita trabajar en diferentes bases de datos:
fuente
Sé que es una pregunta antigua, pero he encontrado esta posibilidad si planeas llamarla con frecuencia.
fuente
sysname
datatype novarchar(50)
. No debe usar unasysobjects
vista obsoleta y no tiene en cuenta el esquema.Puedes usar el siguiente código
O
fuente
Solo agregue aquí, para beneficio de los desarrolladores y otros DBA
un script que recibe @Tablename como parámetro
(que puede o no contener el esquema) y devuelve la siguiente información si existe la tabla de esquema:
Produje este script para usarlo dentro de otros scripts cada vez que necesito probar si existe o no una tabla o vista, y cuando exista, obtenga su object_id para otros fines.
Provoca un error cuando pasa una cadena vacía, un nombre de esquema incorrecto o un nombre de tabla incorrecto.
Esto podría estar dentro de un procedimiento y devolver -1 por ejemplo.
Como ejemplo, tengo una tabla llamada "Facts.FactBackOrder" en una de mis bases de datos de Data Warehouse.
Así es como lo logré:
fuente
dbo.[hello.world ]
y el script no la encontraría por múltiples razones. Dicho esto, es poco probable que alguien quiera crear una tabla así, pero aún así. De todos modos, suTHE_NAME
columna se define comosysname', yet you try to squeeze 2
columnas sysname` y un punto (.
), todo entre corchetes allí ... ¡ese algún día fallará!En SQL Server 2000 puedes probar:
fuente
fuente
Algo importante que debe saber para cualquiera que aún no haya encontrado su solución: SQL server! = MYSQL . Si quieres hacerlo con MYSQL , es bastante simple
Publicar esto aquí porque es el mejor éxito en Google.
fuente
fuente
Puedes usar esto:
fuente
fuente
- - crea un procedimiento para verificar si existe una tabla
- - cómo usar: verifique si existen migraciones de tablas
fuente
fuente
Estoy tomando aquí creando una vista como ejemplo .
Porque los comandos ALTER / CREATE no pueden estar dentro de los bloques BEGIN / END. Debe probar la existencia y soltarla antes de crear
Si le preocupa que se pierdan los permisos, también puede escribir las instrucciones GRANT y volver a ejecutarlas al final.
Podría envolver el crear / alterar en una cadena y hacer un EXEC, que podría ser feo para vistas grandes
fuente
Si alguien está tratando de hacer lo mismo en linq a sql (o especialmente linqpad), active la opción para incluir tablas y vistas del sistema y haga este código:
dado que tiene un objeto con el nombre en una propiedad llamada elemento, y el esquema en una propiedad llamada esquema donde el nombre de la variable de origen es
a
fuente
Si esta es la discusión 'definitiva', entonces debe tenerse en cuenta que el script de Larry Leonard también puede consultar un servidor remoto si los servidores están vinculados.
fuente
He tenido algunos problemas con la selección de INFORMATIONAL_SCHEME y OBJECT_ID. No sé si es un problema del controlador ODBC o algo así. Las consultas del estudio de administración de SQL, ambos, estaban bien.
Aquí está la solución:
Por lo tanto, si la consulta falla, probablemente no haya tal tabla en la base de datos (o no tiene permisos de acceso).
La verificación se realiza comparando el valor (entero en mi caso) devuelto por el ejecutor SQL que se ocupa del controlador ODBC.
fuente
Hay una opción más para verificar si la tabla existe en las bases de datos
fuente
Ejecute esta consulta para verificar si la tabla existe en la base de datos:
fuente
considere en una base de datos que tiene una tabla t1. desea ejecutar el script en otra base de datos como: si t1 existe, no haga nada más para crear t1. Para hacer esto, abra Visual Studio y haga lo siguiente:
Haga clic con el botón derecho en t1, luego en Tabla de scripts como, luego DROP y Create To, luego New Query Editor
Encontrará la consulta deseada. Pero antes de ejecutar ese script, no olvide comentar la declaración drop en la consulta, ya que no desea crear una nueva si ya hay una.
Gracias
fuente