2009-06-17 10 views
2

J'ai beaucoup de code que j'essaie de lancer lorsque j'interroge la table sysobjects pour vérifier si un objet existe avant de le déposer et de le créer à nouveau.Pourquoi IF EXISTS ne fonctionnerait-il pas?

question étant, parfois si je vais:

if not exists (select name from sysobjects o where o.name = 'my_table' and o.type = 'U') 
CREATE TABLE my_table (..) 
go 

cela fonctionne, pas de soucis. Cependant, quand je suis revenu pour l'exécuter à nouveau, je reçois cette belle erreur:

SQL Server Error on (myserver) Error:2714 at Line:10 Message:There is already an object named 'my_table' in the database. 

Merci pour cela, SQL Programmer. En fait, je vous ai demandé de ne pas créer cette table si elle existe déjà. -_-

Des idées?

Répondre

1

la logique de ce que vous faites ne semble pas tout à fait raison. en fonction de votre déclaration:

« Je suis en train de courir où j'interroger la table sysobjects pour vérifier si un objet existe avant que je laisse tomber et créer à nouveau »

il vous suffit de faire une suppression suivie un créer. Cette façon de faire est généralement meilleure car elle garantit que la table sera mise à jour. Si la table existait et que vous aviez des changements, vous n'obtenez probablement pas ce que vous voulez.

Le problème immédiat que vous rencontrez est une propriété db supposée qui n'était pas cohérente entre les exécutions.

en fonction de vos précisions ci-dessous - voici ce que vous pouvez faire:

IF EXISTS (SELECT * FROM sys.objects OÙ object_id = OBJECT_ID (N '[dbo] [XXXX].') Et tapez (n'u ')) DROP TABLE [dbo]. [XXXX] GO

CREATE TABLE [dbo]. [XXXX (... GO

vous pouvez exécuter encore et encore ..

+0

J'ai essayé à la fois le "S'il vous plaît supprimer votre version précédente si vous en avez un, puis installez cette version" et "S'il vous plaît seulement installer version si vous n'en avez pas une précédente ". Je veux juste un script que je peux exécuter encore et encore (pour tester) sans casser quoi que ce soit (codes système multiples, erreurs système essayant de dupliquer les contraintes, etc.) – glasnt

+0

votre logique était erronée. le si existe doit être utilisé pour ne pas créer. – mson

+0

Le 'Si existant' est utilisé pour déposer, puis créer. Sinon, il le crée simplement. Ma logique n'a pas tort. – glasnt

0

La réussite de la validation de l'objet analyseurs sybase est globale et non basée sur une évaluation conditionnelle. Même si votre code ne peut pas exécuter CREATE TABLE, l'instruction est toujours vérifiée pour la syntaxe et l'applicabilité qui échoue lorsque le système voit que la table existe déjà. La seule façon de contourner ce que je connais est de mettre vos instructions create à l'intérieur d'un EXEC() qui ne serait évalué que si la section a été exécutée.

+0

cela semble juste .. mais je n'ai pas une copie de sybase pour tester cela sur –

0

oui, le lot entier de SQL n'est pas rmalisé et compilé de manière à créer un "plan d'exécution" pour l'ensemble du lot. Pendant la normalisation, l'instruction "possible" "créer une table" est un problème si elle existe déjà au moment de la compilation.

Ma solution: renommer -

si elle existe (sélectionnez 1 de ....) commencent drop table xyz create table xyz_zzzz (...) exec sp_rename 'xyz_zzzz', 'xyz'