Verifique si la tabla existe en SQL Server

1143

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

Vincent
fuente
1
¿Por qué es mejor usar INFORMATION_SCHEMA.TABLES en lugar de sys.tables y luego filtrar con el nombre y agregar una verificación de valor type_desc?
DanteTheSmith

Respuestas:

1332

Para consultas como esta, siempre es mejor usar una INFORMATION_SCHEMAvista. 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:

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = 'TheSchema' 
                 AND  TABLE_NAME = 'TheTable'))
BEGIN
    --Do Stuff
END
akmad
fuente
12
¡Funciona genial! Sin embargo, en T-SQL (en respuesta al póster original), es TABLE_SCHEMA, no SCHEMA_NAME. Gracias por el consejo.
Nicholas Piasecki
10
Dado que un nombre de objeto solo (es decir, sin un esquema) no se garantiza que sea único, no hay una forma 100% segura de hacerlo. Si está trabajando con una base de datos que no tiene conflictos de nombres entre esquemas, simplemente omitir "TABLE_SCHEMA = 'TheSchema'" funcionará bien.
akmad
26
Para verificar una tabla temporal, tenemos que consultar la base de datos tempdb y usar un operador LIKE para el nombre de la tablaSELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'
Pierre-Alain Vigeant
44
Una respuesta a continuación que utiliza la función OBJECT_ID funciona correctamente con respecto a las tablas temporales por conexión - stackoverflow.com/a/2155299/16147
Rich Rousseau
44
El compilador de consultas SQL @akmad verificará la tabla antes de ejecutar la consulta y fallará incluso antes de comenzar.
Marc K
278

También tenga en cuenta que si por alguna razón necesita verificar una tabla temporal, puede hacer esto:

if OBJECT_ID('tempdb..#test') is not null
 --- temp table exists
James Bloomer
fuente
10
El uso de este método parece respetar la naturaleza por conexión de las tablas temporales. La consulta anterior de INFORMATION_SCHEMA devolverá filas independientemente de la conexión que creó la tabla.
Rich Rousseau
238

Siempre usamos el OBJECT_IDestilo por el tiempo que recuerdo

IF OBJECT_ID('*objectName*', 'U') IS NOT NULL 
Bob King
fuente
16
Creo que esto sería rápido, aunque no muy portátil. Se garantiza que las vistas de esquema de información existen en cualquier DBRMS que admita el estándar. Además, el OBJECT_ID simple no garantiza que el objeto sea una tabla.
Joe Pineda
99
Gracias Joe, me preguntaba por qué usarías OBJECT_ID vs INFORMATION_SCHEMA.TABLES vs sys.tables. Señalando que INFORMATION_SCHEMA es parte de un estándar prácticamente responde a esa pregunta. Por cierto, es divertido, uno de nuestros expertos en bases de datos que iba a hacer esta pregunta tiene el mismo apellido que usted, debe ser un buen apellido para las bases de datos.
Apeiron
24
@JoePineda: Entonces, puede usarlo OBJECT_ID('TableName', 'U')para garantizar que el objeto sea una tabla.
Allon Guralnek
1
@AllonGuralnek, entonces, en lugar de seguir un estándar simple y portátil, ¿agregar una información adicional críptica?
define
22
@DustinFineout: La pregunta fue etiquetada tsql , por lo que la portabilidad no se aplica tanto. En general, he encontrado muy pocas bases de código verdaderamente portátiles y si se valora la concisión, entonces es mejor que escribir esa IF EXISTSconsulta 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).
Allon Guralnek
132

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.

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')
BEGIN
    PRINT 'Table Exists'
END

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.

IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULL
BEGIN
    PRINT 'Table Exists'
END

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:

IF EXISTS(SELECT 1 FROM sys.Objects WHERE  Object_id = OBJECT_ID(N'dbo.Customers') AND Type = N'U')
BEGIN
   PRINT 'Table Exists'
END

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:

 IF EXISTS(SELECT 1 FROM sys.Tables WHERE  Name = N'Customers' AND Type = N'U')
 BEGIN
      PRINT 'Table Exists'
 END

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.

  IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' AND xtype = N'U')
  BEGIN
     PRINT 'Table Exists'
  END

referido de: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/

BrainCoder
fuente
37

Buscando una tabla en una base de datos diferente:

if exists (select * from MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'
Larry Leonard
fuente
26

Solo quería mencionar una situación en la que probablemente sería un poco más fácil usar el OBJECT_IDmétodo. Las INFORMATION_SCHEMAvistas son objetos debajo de cada base de datos.

Las vistas del esquema de información se definen en un esquema especial denominado INFORMATION_SCHEMA. Este esquema está contenido en cada base de datos.

https://msdn.microsoft.com/en-us/library/ms186778.aspx

Por lo tanto, todas las tablas a las que accede utilizando

IF EXISTS (SELECT 1 
           FROM [database].INFORMATION_SCHEMA.TABLES 
           WHERE TABLE_TYPE='BASE TABLE' 
           AND TABLE_NAME='mytablename') 
   SELECT 1 AS res ELSE SELECT 0 AS res;

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_IDle permitirá hacer esto de forma inmediata. Ex-

IF OBJECT_ID (N'db1.schema.table1', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

funciona tan bien como

IF OBJECT_ID (N'db2.schema.table1', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

SQL SERVER 2016 Edit :

A partir de 2016, Microsoft simplificó la capacidad de verificar objetos inexistentes antes de colocarlos, agregando las if existspalabras clave a las dropdeclaraciones. Por ejemplo,

drop table if exists mytablename

hará lo mismo que OBJECT_ID/ INFORMATION_SCHEMAwrappers, 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/

iliketocode
fuente
25
IF OBJECT_ID('mytablename') IS NOT NULL 
sansalk
fuente
13

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.

Vinko Vrsalovic
fuente
12
Esto debería haber sido un comentario.
underscore_d
3
Esta respuesta necesita mejoras.
rory.ap
11
IF EXISTS 
(
    SELECT   * 
    FROM     sys.objects 
    WHERE    object_id = OBJECT_ID(N'[dbo].[Mapping_APCToFANavigator]') 
             AND 
             type in (N'U')
)
BEGIN

    -- Do whatever you need to here.

END

Aquí en el código anterior, el nombre de la tabla es Mapping_APCToFANavigator.

dilip kumar singh
fuente
2
Si el código de poste, XML o datos de muestras, por favor, destacar aquellas líneas en el editor de texto y haga clic en el botón "muestras de código" ( { }) en la barra de herramientas de editor de formato y la sintaxis muy bien resáltala!
marc_s
1
Tenga en cuenta que el acceso a las tablas del sistema podría interrumpirse en futuras versiones de SQL Server. Utilice vistas de esquema en su lugar.
Olivier Jacot-Descombes
10

Si necesita trabajar en diferentes bases de datos:

DECLARE @Catalog VARCHAR(255)
SET @Catalog = 'MyDatabase'

DECLARE @Schema VARCHAR(255)
SET @Schema = 'dbo'

DECLARE @Table VARCHAR(255)
SET @Table = 'MyTable'

IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES   
    WHERE TABLE_CATALOG = @Catalog 
      AND TABLE_SCHEMA = @Schema 
      AND TABLE_NAME = @Table))
BEGIN
   --do stuff
END
Incluso Mien
fuente
1
¿Estás seguro? El esquema de información en mi cuadro de 2005 solo devuelve el catálogo actual.
Quillbreaker
8

Sé que es una pregunta antigua, pero he encontrado esta posibilidad si planeas llamarla con frecuencia.

create procedure Table_Exists
@tbl varchar(50)
as
return (select count(*) from sysobjects where type = 'U' and name = @tbl)
go
dko
fuente
99
-1. No tiene sentido tener un procedimiento para esto, ya que es tanto código para llamar y consumir la devolución como simplemente hacer la selección. Debería usar sysnamedatatype no varchar(50). No debe usar una sysobjectsvista obsoleta y no tiene en cuenta el esquema.
Martin Smith
6

Puedes usar el siguiente código

IF (OBJECT_ID('TableName') IS NOT NULL )
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END

O

IF (EXISTS (SELECT * FROM sys.tables WHERE [name] = 'TableName'))
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END
Reza Jenabi
fuente
5

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:

the_name                object_id   the_schema  the_table       the_type
[Facts].[FactBackOrder] 758293761   Facts       FactBackOrder   Table

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é:

PRINT 'THE SERVER IS ' + @@SERVERNAME
--select db_name()
PRINT 'THE DATABASE IS ' + db_NAME() 
PRINT ''
GO

SET NOCOUNT ON
GO

--===================================================================================
-- @TableName is the parameter
-- the object we want to deal with (it might be an indexed view or a table)
-- the schema might or might not be specified
-- when not specified it is DBO
--===================================================================================

DECLARE @TableName SYSNAME

SELECT @TableName = 'Facts.FactBackOrder'
--===================================================================================
--===================================================================================
DECLARE @Schema SYSNAME
DECLARE @I INT
DECLARE @Z INT 

SELECT @TableName = LTRIM(RTRIM(@TableName))
SELECT @Z = LEN(@TableName)

IF (@Z = 0) BEGIN

            RAISERROR('Invalid @Tablename passed.',16,1)

END 

SELECT @I = CHARINDEX('.',@TableName )
--SELECT @TableName ,@I

IF @I > 0 BEGIN

        --===================================================================================
        -- a schema and table name have been passed
        -- example Facts.FactBackOrder 
        -- @Schema = Fact
        -- @TableName = FactBackOrder
        --===================================================================================

   SELECT @Schema    = SUBSTRING(@TABLENAME,1,@I-1)
   SELECT @TableName = SUBSTRING(@TABLENAME,@I+1,@Z-@I)



END
ELSE BEGIN

        --===================================================================================
        -- just a table name have been passed
        -- so the schema will be dbo
        -- example Orders
        -- @Schema = dbo
        -- @TableName = Orders
        --===================================================================================

   SELECT @Schema    = 'DBO'     


END

        --===================================================================================
        -- Check whether the @SchemaName is valid in the current database
        --===================================================================================

IF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.SCHEMATA K WHERE K.[SCHEMA_NAME] = @Schema ) BEGIN

            RAISERROR('Invalid Schema Name.',16,1)

END 

--SELECT @Schema  as [@Schema]
--      ,@TableName as [@TableName]


DECLARE @R1 TABLE (

   THE_NAME SYSNAME
  ,THE_SCHEMA SYSNAME
  ,THE_TABLE SYSNAME
  ,OBJECT_ID INT
  ,THE_TYPE SYSNAME
  ,PRIMARY KEY CLUSTERED (THE_SCHEMA,THE_NAME)

)

;WITH RADHE_01 AS (
SELECT QUOTENAME(SCHEMA_NAME(O.schema_id)) + '.' + QUOTENAME(O.NAME) AS [the_name]
      ,the_schema=SCHEMA_NAME(O.schema_id)
      ,the_table=O.NAME
      ,object_id =o.object_id 
      ,[the_type]= CASE WHEN O.TYPE = 'U' THEN 'Table' ELSE 'View' END 
from sys.objects O
where O.is_ms_shipped = 0
AND O.TYPE IN ('U','V')
)
INSERT INTO @R1 (
   THE_NAME 
  ,THE_SCHEMA 
  ,THE_TABLE 
  ,OBJECT_ID
  ,THE_TYPE 
)
SELECT  the_name
       ,the_schema
       ,the_table
       ,object_id
       ,the_type
FROM RADHE_01
WHERE the_schema = @Schema 
  AND the_table  = @TableName

IF (@@ROWCOUNT = 0) BEGIN 

             RAISERROR('Invalid Table Name.',16,1)

END 
ELSE BEGIN

    SELECT     THE_NAME 
              ,THE_SCHEMA 
              ,THE_TABLE 
              ,OBJECT_ID
              ,THE_TYPE 

    FROM @R1

END 
Marcello Miorelli
fuente
Hay muchos supuestos en su secuencia de comandos. Por ejemplo, podría crear fácilmente una tabla llamada 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, su THE_NAMEcolumna se define como sysname', yet you try to squeeze 2 columnas sysname` y un punto (. ), todo entre corchetes allí ... ¡ese algún día fallará!
deroby
@deroby Estoy de acuerdo con que sysname no es el mejor tipo de datos que se utilizará, sin embargo, el script se ha estado ejecutando durante mucho tiempo sin ningún error, dedicaría tiempo solo si encuentro una situación razonable en la que no funciona. Aún mejor, tome este código, mejórelo y publíquelo aquí como respuesta y lo probaré, si funciona, votaré su respuesta.
Marcello Miorelli
5

En SQL Server 2000 puedes probar:

IF EXISTS(SELECT 1 FROM sysobjects WHERE type = 'U' and name = 'MYTABLENAME')
BEGIN
   SELECT 1 AS 'res' 
END
dipi evil
fuente
3
IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

    WHERE   TABLE_SCHEMA = 'PutSchemaHere'     
            AND  
            TABLE_NAME   = 'PutTableNameHere'
)
Mocasín
fuente
2

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

    $sql = "SELECT 1 FROM `db_name`.`table_name` LIMIT 1;";
    $result = mysql_query($sql);
    if( $result == false )
        echo "table DOES NOT EXIST";
    else
        echo "table exists";

Publicar esto aquí porque es el mejor éxito en Google.

phil294
fuente
44
-1 porque el OP está pidiendo precisamente una solución de SQL Server para el problema, no la de MySQL. Escribió sobre MySQL porque sabía la solución en ese DBMS y quería el mismo resultado en SQL Server. Además, su respuesta ni siquiera es una consulta MySQL, sino un código PHP que funciona con MySQL.
mordack550
1
@ mordack550, estoy de acuerdo con Blauhirn. El tiene razón. Este es el principal éxito en Google para averiguar si existe una tabla en SQL. Sus intenciones son buenas y su información es útil. +1
Mark
Es lamentable que Microsoft tenga la costumbre de tratar de adoptar / extender / extinguir estándares y patrones comunes como SQL. Realmente desearía que hubieran dado a su implementación de un servidor SQL un nombre propio para que las personas pudieran identificar referencias específicas a su producto sin ambigüedades.
psaxton
2
IF EXISTS (   SELECT * FROM   dbo.sysobjects WHERE  id = OBJECT_ID(N'dbo.TableName') AND OBJECTPROPERTY(id, N'IsUserTable') = 1 )
BEGIN
  SELECT * FROM dbo.TableName;
END
GO
Krishnaraj Barvathaya
fuente
2

Puedes usar esto:

     IF OBJECT_ID (N'dbo.T', N'U') IS NOT NULL 
        BEGIN 
            print 'deleted table';
            drop table t 
        END
     else 
        begin 
            print 'table not found' 
        end

 Create table t (id int identity(1,1) not null, name varchar(30) not null, lastname varchar(25) null)
 insert into t( name, lastname) values('john','doe');
 insert into t( name, lastname) values('rose',NULL);

 Select * from t
1   john    doe
2   rose    NULL

 -- clean
 drop table t
BTE
fuente
1
select name from SysObjects where xType='U' and name like '%xxx%' order by name
MarceloMadnezz
fuente
1

- - crea un procedimiento para verificar si existe una tabla


DELIMITER $$

DROP PROCEDURE IF EXISTS `checkIfTableExists`;

CREATE PROCEDURE checkIfTableExists(
    IN databaseName CHAR(255),
    IN tableName CHAR(255),
    OUT boolExistsOrNot CHAR(40)
)

  BEGIN
      SELECT count(*) INTO boolExistsOrNot FROM information_schema.TABLES
      WHERE (TABLE_SCHEMA = databaseName)
      AND (TABLE_NAME = tableName);
  END $$

DELIMITER ;

- - cómo usar: verifique si existen migraciones de tablas


 CALL checkIfTableExists('muDbName', 'migrations', @output);
Mathieu Dierckx
fuente
1
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE 
TABLE_CATALOG = 'Database Name' and
TABLE_NAME = 'Table Name' and 
TABLE_SCHEMA = 'Schema Name') -- Database and Schema name in where statement can be deleted

BEGIN
--TABLE EXISTS
END

ELSE BEGIN
--TABLE DOES NOT EXISTS
END
Mohamad Reza Shahrestani
fuente
1

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

IF Object_ID('TestView') IS NOT NULL
DROP VIEW TestView

GO

CREATE VIEW TestView
   as
   . . .

GO

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

DECLARE @SQL as varchar(4000)

-- set to body of view
SET @SQL = 'SELECT X, Y, Z FROM TABLE' 

IF Object_ID('TestView') IS NULL
    SET @SQL = 'CREATE VIEW TestView AS ' + @SQL
ELSE    
    SET @SQL = 'ALTER VIEW TestView AS ' + @SQL
Kelum Sampath Edirisinghe
fuente
0

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:

let oSchema = sys.Schemas.FirstOrDefault(s=>s.Name==a.schema )
where oSchema !=null
let o=oSchema!=null?sys.Objects.FirstOrDefault (o => o.Name==a.item && o.Schema_id==oSchema.Schema_id):null
where o!=null

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

Maslow
fuente
0

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.

if exists (select * from REMOTE_SERVER.MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'
user3651072
fuente
¿Quizás sea más adecuado agregar esto como un comentario a la respuesta de Leonards o tal vez como una edición?
EWit
0

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:

SELECT COUNT(*) FROM <yourTableNameHere>

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.

if (sqlexec(conectionHandle, 'SELECT COUNT(*) FROM myTable') == -1) {
  // myTable doesn't exist..
}
Michael Quad
fuente
¿Con qué salida falla?
wscourge
@wscourge, la consulta SQL falló o algo similar. Acabo de comprobar el valor de retorno de la función ejecutor.
Michael Quad
Agréguelo
0

Hay una opción más para verificar si la tabla existe en las bases de datos

IF EXISTS(SELECT 1 FROM [change-to-your-database].SYS.TABLES WHERE NAME = 'change-to-your-table-name')
BEGIN
    -- do whatever you want
END
Jitan Gupta
fuente
-1

Ejecute esta consulta para verificar si la tabla existe en la base de datos:

IF(SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'YourTableName') IS NOT NULL
PRINT 'Table Exists';
S Krishna
fuente
-6

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

sumon
fuente
En SSMS 2012 ya no realiza la verificación si existe, si alguna vez lo hizo (no recuerdo cómo las versiones anteriores generaban el script anterior). ¿Quizás te equivocas con la forma en que otras herramientas de db son objetos de tabla de secuencias de comandos?
Ivaylo Slavov
SSMS realizará la verificación si existe si usted lo solicita. Herramientas> Opciones> Explorador de objetos de SQL Server> Secuencias de comandos> "Opciones de secuencias de comandos de objetos": "Verificar la existencia de objetos" = Verdadero
Seann Alexander