tsql - consultas - ejemplos de sql en base de datos
¿Cómo creo condicionalmente una tabla en Sybase(TSQL)? (9)
OK, entonces Sybase (12.5.4) me permitirá hacer lo siguiente para DEJAR caer 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 avisan que la tabla ya existe, porque siguió adelante y trató de crear mi tabla e ignoró la declaración condicional. Solo intenta ejecutar la siguiente declaración dos veces, verás 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 Line: 7 Mensaje: Ya hay un objeto llamado ''a_table'' en la base de datos.
¿Cuál es el problema con eso?
La única solución que he encontrado hasta ahora es usar execute immediate:
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 amuleto, se siente como un sucio truco.
No he probado esto, pero podrías intentar mover la declaración de crear tabla a un sproc. A continuación, puede llamar condicionalmente a ese sproc en función de su declaración if existente.
IF object_id(''a_table'') IS NULL
BEGIN
CREATE TABLE a_table (
col1 int not null,
col2 int null
)
END
Intenta usar Begin y End.
SI NO EXISTE (SELECCIONE Count (1) FROM sysobjects WHERE name = ''a_table'' AND type = ''U'') BEGIN CREATE TABLE a_table (col1 int not null, col2 int null) END GO
Asigne la instrucción "CREATE TABLE" en una variable @ char y luego haga un EXEC (@variable).
Si desea crear siempre la tabla, pero condicionalmente soltarla, puede usar:
IF(SELECT count(*) FROM sysobjects WHERE name="tableNameWithoutUserPart") > 0
DROP TABLE tableNameWithUserPart
GO
CREATE TABLE tableNameWithUserPart ...
No hay soluciones alternativas;)
De acuerdo con 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 usa SI NO EXISTE.
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 ;
No hay otra manera que llamar a create table
en execute("create table ...")
El manual de SYBASE dice:
Cuando se produce un comando create table dentro de un bloque if ... else o un ciclo while, Adaptive Server crea el esquema para la tabla antes de determinar si la condición es verdadera. Esto puede provocar errores si la tabla ya existe. Para evitar esta situación, asegúrese de que una vista con el mismo nombre no exista en la base de datos o use una instrucción execute, como se muestra a continuación:
if not exists
(select * from sysobjects where name="my table")
begin
execute "create table mytable(x int)"
end