¿Cómo creo condicionalmente una tabla en Sybase (SQL)?
-
08-07-2019 - |
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 ?!
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