2009-04-21 8 views
4

j'ai le même problème que décrit dans this question, mais il est SQL Server 2005 et la « acceptée » réponse ne fonctionne pas dans SQL Server 2000.colonne de chute SQL Server 2000 avec des contraintes

Plus précisément: Je suis essayer d'exécuter ALTER TABLE foo DROP COLUMN bar, et il échoue parce qu'il y a une "contrainte par défaut". Ce qui signifie, j'ai une valeur par défaut sur cette colonne que SQL Server implémente comme une contrainte séparée que je dois d'abord supprimer. Le problème est qu'aucun nom n'a été donné pour la contrainte par défaut lors de la création de la colonne. Je dois donc interroger les tables système pour découvrir le nom (généré automatiquement) de la contrainte.

La réponse donnée dans cette autre question fonctionne pour moi dans SQL Server 2005 mais pas dans SQL Server 2000. J'ai besoin de ce dernier.

[UPDATE] J'ai besoin d'une requête qui peut répondre à la question « Quel est le nom de la contrainte par défaut pour la colonne bar dans le tableau foo. » Ce n'est pas un moyen pour un être humain de trouver manuellement la réponse.

+0

Pourquoi faites-vous cela à la dure? Vous savez déjà qu'il est obsolète quand ils mettent à jour leur serveur. – dkretz

+0

Que voulez-vous dire "c'est obsolète?" Ce sont des serveurs fonctionnant sur les sites des clients. –

Répondre

3

Vous venez de comprendre ce que la requête SQL 2005 référencée faisait réellement. Voici une réplique de cette requête qui fonctionne dans SQL 2000

select 
    col.name, 
    col.colorder, 
    col.cdefault, 
    OBJECTPROPERTY(col.cdefault, N'IsDefaultCnst') as is_defcnst, 
    dobj.name as def_name 
from syscolumns col 
    left outer join sysobjects dobj 
     on dobj.id = col.cdefault and dobj.type = 'D' 
where col.id = object_id(N'dbo.table_name') 
and dobj.name is not null 
+0

Ça a l'air bien. Cela semble également fonctionner dans SQL Server 2005 - devrait-il? Vous utilisez col.cdefault au lieu de col.default_object_id - sont les deux en 2005? –

+0

SQL Server 2005 a des vues de compatibilité qui imitent les tables système dans SQL Server 2000. Ainsi, alors que le script 2005 utilise sys.objects, SQL 2000 utilise sysobjects (sans le point), qui est également disponible en tant que vue de compatibilité dans SQL Server 2005 . Cela a-t-il du sens? – bdukes

+0

Donne un sens, merci. Subtil! –

0
sp_help 'tablename' 

vous donne un tas d'informations sur la table - y compris toutes les contraintes et les noms de contrainte

En fait, les appels sp_help ceci:

sp_helpconstraint 'tablename', nomsg 

contraintes par défaut vont dire « DEFAULT sur colonne xxx "

+0

Je cours cela et obtiens une pile d'objets ResultSet. Comment déterminer quelle contrainte est pour les valeurs par défaut? Je peux voir en tant qu'humain, mais quelle est la bonne * question * que je peux faire par programmation? –

+0

OK ... est-il possible de réduire ceci à une seule requête qui retournera une ligne avec la réponse (s'il y a une contrainte par défaut), ou aucune ligne s'il n'y a pas de réponse? Ou au moins un seul ensemble de résultats où il est facile de trouver la réponse en fonction d'un nom de colonne? –

1

pour obtenir une liste des contraintes par défaut pour une table, essayez cette

select * from sysobjects [constraint] 
join sysobjects [table] on [constraint].parent_obj = [table].id 
where [constraint].type = 'D' 
and [table].name = 'table_name' 
--another option: and [table].id = OBJECT_ID(N'dbo.table_name') 
+0

Cela semble proche (+1), mais je ne vois pas le nom de la colonne dans ces lignes. Comment puis-je déterminer quelle ligne va avec quelle colonne? –

0

Celui-ci est construit sur la première solution fournie par bdukes, mélangé avec INFORMATION_SCHEMA.COLUMNS, il semble que les informations contient la position ordinale de la colonne par défaut appartient

SELECT name 
FROM sysobjects [constraint] 
JOIN sysobjects [table] on [constraint].parent_obj = [table].id 
JOIN information_schema.columns col ON [table].name = col.table_name AND [constraint].info = col.ordinal_position 
WHERE [constraint].type = 'D' 
AND [table].name = 'table_name' 
AND col.column_name = 'column_name' 
Questions connexes