Question

OK, donc Sybase (12.5.4) me laissera faire ce qui suit pour supprimer un tableau s’il existe déjà:

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

Mais si j'essaie de faire la même chose avec la création de table, je suis toujours averti que la table existe déjà, car elle a été créée et a essayé de créer ma table et d'ignorer l'instruction conditionnelle. Essayez d'exécuter l'instruction suivante deux fois, vous verrez ce que je veux dire:

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

L'exécution de ce qui précède génère l'erreur suivante:

  

Erreur SQL Server sur (hôte local)   Erreur: 2714 à la ligne: 7 Message: Il y a   déjà un objet nommé 'a_table' dans   la base de données.

Quel est le problème avec ça?!

Était-ce utile?

La solution

La seule solution que j'ai trouvée jusqu'à présent consiste à utiliser exécuter immédiatement:

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

fonctionne comme un charme, ressemble à un sale bidouille.

Autres conseils

Il n'y a pas d'autre moyen d'appeler create table dans execute (" create table ... ")

Le manuel SYBASE dit:

  

Quand une commande create table est exécutée dans un bloc if ... else ou un   Alors que boucle, Adaptive Server crée le schéma pour la table avant   déterminer si la condition est vraie. Cela peut entraîner des erreurs si   la table existe déjà. Pour éviter cette situation, assurez-vous qu'un   la vue avec le même nom n'existe pas déjà dans la base de données ou n'est pas utilisée   une instruction d'exécution, comme suit:

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

Je n'ai pas testé cela, mais vous pouvez essayer de déplacer l'instruction create table dans un sproc. Vous pouvez ensuite appeler conditionnellement ce sproc en fonction de votre déclaration if existante.

Affectez le " CREATE TABLE " instruction dans une variable car @ et ensuite faire un EXEC (@variable).

Si vous voulez toujours créer la table, mais la supprimer conditionnellement, vous pouvez utiliser:

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

CREATE TABLE tableNameWithUserPart ...

Il n’existe aucune solution de contournement nécessaire;)

Selon la documentation:

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 ]

Utilisez simplement le fichier IF NOT EXISTS.

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

Cela fonctionne avec les tests Sybase 10.01 :

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

Essayez d’utiliser Begin et End.

SI PAS EXISTE (     SELECT Count (1)     DE sysobjects     WHERE name = 'a_table'     ET type = 'U' ) COMMENCEZ CREATE TABLE a_table (     col1 int non null,     col2 int null ) FIN GO

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top