2008-11-21 20 views
11

OK, así Sybase (12.5.4) me deja hacer lo siguiente para eliminar una tabla si ya existe:¿Cómo creo condicionalmente una tabla en Sybase (TSQL)?

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 dan advertido que la tabla ya existe, porque siguió adelante y trató de crear mi tabla e ignoró la declaración condicional. Sólo trate de ejecutar la siguiente declaración en dos ocasiones, 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 

Ejecución del anterior produce el siguiente error:

SQL Server Error on (localhost) Error:2714 at Line:7 Message:There is already an object named 'a_table' in the database.

Cuál es el problema con eso ?!

+0

¿Qué hay con las respuestas de downvoting? ¿Y luego premiarte con la aceptación? Por una falta de respuesta? – dkretz

+0

He bajado las respuestas que no ayudan a responder la pregunta, ese es el propósito de la votación negativa. He votado a favor de las respuestas que me ayudaron y fueron viables, pero al final la única solución que funcionó para mí fue la mía. No obtengo un representante por responder mi propia pregunta, por lo que no me conviene hacerlo. – ninesided

+0

Bastante justo. Recordaré no responder, a menos que esté seguro de que su respuesta sea respondida. En este caso, no había suficiente información para saber, así que estaba perdiendo el tiempo. – dkretz

Respuesta

12

La única solución que he encontrado hasta el momento es el uso de ejecución inmediata:

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.

+4

Sé que respondiste esto hace mucho tiempo, pero para información de otras personas, así es exactamente como el manual de sybase indica que una creación condicional debe suceder porque "Cuando ocurre un comando create table dentro de un bloque if ... else o 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 utilice una instrucción de ejecución ... " – scrappedcola

+1

De acuerdo .. Solo quería incluir un enlace a los documentos http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0. comandos/html/comandos/comandos61.htm – msrxthr

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

No, esto también falla. Mismo error. – ninesided

2

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

-2

Intente utilizar Begin y End.

SI NO EXISTE ( SELECT Count (1) DE sysobjects WHERE nombre = 'a_table' Y tipo = 'U' ) COMENZAR CREATE a_table TABLA ( col1 no int null, col2 int nula ) FIN IR

+0

lo siento, no hay dados. "Ya hay un objeto llamado 'a_table' en la base de datos". – ninesided

1

asignar la sentencia "CREATE TABLE" en un @variable carbón y luego hacer un Exec (@ variable).

7

No hay otra forma de llamar a create table en execute("create table ...")

Manual SYBASE dice:

When a create table command occurs within an if...else block or a while loop, Adaptive Server creates the schema for the table before determining whether the condition is true. This may lead to errors if the table already exists. To avoid this situation, either make sure a view with the same name does not already exist in the database or use an execute statement, as follows:

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

Si desea crear siempre la mesa, pero condicionalmente dejarlo caer, puede utilizar:

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

CREATE TABLE tableNameWithUserPart ... 
0

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 ] 

Sólo tiene que utilizar el SI NO EXISTE.

+1

Esto es incorrecto, ya que OP está mirando Sybase ASE, cuya documentación está aquí: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc01840.1600/doc/html /san1281564827401.html. La gramática que copia es de SAP Sybase IQ http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc01840.1600/doc/html/san1281564827401.html que es otro producto. – nhahtdh

+0

La sintaxis que copié proviene de mi documentación de Sybase Anywhere 12 fuera de línea y esa sintaxis funciona allí. Ok no vio la etiqueta ASE;) –

-1

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 ; 
+1

esta pregunta se refiere a ASE, no a ningún lado – ninesided

Cuestiones relacionadas