Pregunta

OK, entonces Sybase (12.5.4) me permitirá hacer lo siguiente para DESACTIVAR una tabla si ya existe:

IF EXISTS (
    SELECT 1
    FROM sysobjects
    WHERE name = 'a_table'
    AND type = 'U'
)
DROP TABLE a_table
GO

Pero si trato de hacer lo mismo con la creación de la tabla, siempre me advierten que la tabla ya existe, porque siguió adelante e intenté crear mi tabla e ignoré la declaración condicional. Simplemente intente ejecutar la siguiente declaración dos veces, verá lo que quiero decir:

IF NOT EXISTS (
    SELECT 1
    FROM sysobjects
    WHERE name = 'a_table'
    AND type = 'U'
)
CREATE TABLE a_table (
    col1 int not null,
    col2 int null
)
GO

Ejecutar lo anterior produce el siguiente error:

  

Error de SQL Server en (localhost)   Error: 2714 en la línea: 7 Mensaje: Hay   ya un objeto llamado 'a_table' en   la base de datos.

¡¿Cuál es el problema con eso ?!

¿Fue útil?

Solución

La única solución que he encontrado hasta ahora es usar ejecutar inmediatamente:

IF NOT EXISTS (
    SELECT 1
    FROM sysobjects
    WHERE name = 'a_table'
    AND type = 'U'
)
EXECUTE("CREATE TABLE a_table (
    col1 int not null,
    col2 int null
)")
GO

funciona como un encanto, se siente como un truco sucio.

Otros consejos

No hay otra forma que llamar a crear tabla en ejecutar (" crear tabla ... ")

El manual SYBASE dice:

  

Cuando se produce un comando de creación de tabla dentro de un bloque if ... else o un   while loop, Adaptive Server crea el esquema para la tabla antes   determinar si la condición es verdadera. Esto puede conducir a errores si   La tabla ya existe. Para evitar esta situación, asegúrese de   la vista con el mismo nombre aún no existe en la base de datos o el uso   una instrucción de ejecución, como sigue:

if not exists
    (select * from sysobjects where name="my table")
begin
execute "create table mytable(x int)"
end

No he probado esto, pero podría intentar mover la instrucción de creación de tabla a un sproc. Luego, puede llamar condicionalmente a ese sproc en función de su declaración if existente.

Asignar la " CREAR TABLA " en una char @variable y luego hacer un EXEC (@variable).

Si desea crear siempre la tabla, pero soltarla condicionalmente, puede usar:

IF(SELECT count(*) FROM sysobjects WHERE name="tableNameWithoutUserPart") > 0
    DROP TABLE tableNameWithUserPart
GO

CREATE TABLE tableNameWithUserPart ...

No se necesitan soluciones alternativas;)

Según la documentación:

CREATE [ GLOBAL TEMPORARY ] TABLE [ IF NOT EXISTS ] [ owner.]table-name
( { column-definition | table-constraint | pctfree }, ... )
[ { IN | ON } dbspace-name ]
[ ENCRYPTED ]
[ ON COMMIT { DELETE | PRESERVE } ROWS
   | NOT TRANSACTIONAL ]
[ AT location-string ]
[ SHARE BY ALL ]

Simplemente use SI NO EXISTE.

IF object_id('a_table') IS NULL
BEGIN
    CREATE TABLE a_table (
        col1 int not null,
        col2 int null
    ) 
END

Esto funciona cuando se prueba con Sybase en cualquier lugar 10.01 :

if not exists(select * from SysColumns where tname = 'AAA') then create table DBA.AAA(  UNIQUEID integer not null ) END IF ;

Intenta usar Begin y End.

SI NO EXISTE (     SELECCIONAR Cuenta (1)     DE sysobjects     WHERE name = 'a_table'     AND type = 'U' ) COMENZAR CREATE TABLE a_table (     col1 int no es nulo,     col2 int null ) FIN IR

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top