¿Cómo puedo condicionalmente crear una tabla en Sybase (TSQL)?

OK, Sybase (12.5.4) me deja hacer lo siguiente para quitar 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 advirtió que la tabla ya existe, porque iban delante y trató de crear mi mesa y se omite la instrucción condicional. Sólo trate de la ejecución de la siguiente instrucción dos veces, usted 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 de la anterior produce el siguiente error:

De Error de SQL Server (localhost)
Error:2714 en Línea:7 Mensajes:Hay
ya un objeto denominado ‘a_table’ en
la base de datos.

¿Cuál es el problema con eso?!

¿Qué pasa con downvoting respuestas? Y, a continuación, premio a sí mismo la aceptación? Para un no-respuesta?
He votada abajo respuestas que no ayudan a responder a la pregunta, que es el propósito de downvoting. He upvoted respuestas que ayudaron y fueron viables, pero al final la única solución que funcionó para mí era la mía. No entiendo rep por responder a mi propia pregunta, así que no es para mi una ventaja para hacerlo.
Justo lo suficiente. Voy a recordar para no responder a menos estoy seguro de que tu pregunta es tratado por mi respuesta. En este caso, no había suficiente información para saber, para que yo estaba perdiendo mi tiempo.
OK, puedo ver dónde vienes, tiempo invertido en tratar de resolver mi pregunta, la cual debo agradecer, no se penalizará. Mientras que el otro votada abajo respuestas fueron simplemente incorrecta, la suya fue más considerado – admito que fue demasiado apresurado en downvoting. Disculpas, me han revocado el -1.

OriginalEl autor ninesided | 2008-11-21

6 Kommentare

  1. 13

    La única solución que he llegado hasta ahora es usar 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 sucio truco.

    Sé que respondió esto hace mucho tiempo, pero para los otros pueblos de la información esta es exactamente la forma en la sybase manual estados condicional crear necesidades a suceder, porque «Cuando un comando create table se produce dentro de un bloque if…else o de un bucle while, Adaptive Server crea el esquema de la tabla antes de 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 una vista con el mismo nombre ya no existe en la base de datos o utilizar una instrucción execute…»
    Acordado.. Sólo quería incluir un enlace a la documentación infocenter.sybase.com/help/index.jsp?topic=/…
    FYI, puede que tenga Que poner el comando ejecutar en comillas simples en lugar de las comillas dobles.

    OriginalEl autor ninesided

  2. 7

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

    SYBASE Manual dice:

    Cuando un comando create table se produce dentro de un bloque if…else o un
    bucle while, Adaptive Server crea el esquema de la tabla antes de
    la determinación de si la condición es verdadera. Esto puede conducir a errores si
    la tabla ya existe. Para evitar esta situación, asegurarse de que un
    vista con el mismo nombre ya no existe en la base de datos o utilizar
    una instrucción execute, de la siguiente manera:

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

    OriginalEl autor Vinay

  3. 2

    No he probado esto, pero podría intentar mover la instrucción create table en un procedimiento almacenado. Entonces, usted puede condicionalmente llamar a procedimiento almacenado que basado en el existente si la instrucción.

    OriginalEl autor AdamH

  4. 1

    Asignar el «CREAR TABLA» instrucción de un char @variable y, a continuación, hacer un EXEC(@variable).

    OriginalEl autor B0rG

  5. 1

    Si se desea crear la tabla, pero condicionalmente caer, puede utilizar:

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

    OriginalEl autor Mark Rhodes

  6. 0

    No hay soluciones necesarias 😉

    De acuerdo a 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 utilizar la SI NO EXISTE.

    Esto es incorrecto, ya que el OP está mirando Sybase ASE, cuya documentación está aquí: infocenter.sybase.com/help/index.jsp?topic=/…. La gramática copia de SAP Sybase IQ infocenter.sybase.com/help/index.jsp?topic=/…, que es otro producto.
    La sintaxis he copiado es de mi sin conexión de Sybase en cualquier Lugar 12 de la Documentación y la sintaxis de los trabajos. Ok no ver la ASE de la etiqueta 😉

    OriginalEl autor Diego Frehner

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea