Comment vérifier si il existe une colonne dans une table SQL Server?
J'ai besoin d'ajouter une colonne spécifique si elle n'existe pas. J'ai quelque chose comme ce qui suit, mais il renvoie toujours false:
IF EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName')
Comment puis-je vérifier si il existe une colonne dans une table de la base de données SQL Server?
Je ne pense pas qu'il ya quelque chose de mal avec le code dans la question: Œuvres finement pour moi en 2008 R2. (Peut-être que vous lanciez dans la mauvaise base de données? Peut-être que votre base de données a été sensible à la casse et vous n'avez pas le cas dans votre myTableName / myColumnName cordes? Ce type de requête semble plus souple que le COL_LENGTH solution: je suis capable de l'exécuter à l'encontre d'une autre base de données et même au-dessus un lien de base de données par du personnel dûment ajoutant le préfixe "INFORMATION_SCHEMA". Ne pouvais pas voir comment le faire avec le COL_LENGTH les métadonnées de la fonction.
Peu liées astuce: si vous voulez mettre à jour une colonne à droite après la colonne plus(je crois que de nombreux utilisateurs ont été à la recherche de cet article), vous pouvez utiliser
La vraie réponse est que vous devez l'ajouter à la base de données que vous vérifiez contre il est donc
COL_LENGTH('AdventureWorks2012.HumanResources.Department ','ModifiedDate')
fonctionne très bien.Peu liées astuce: si vous voulez mettre à jour une colonne à droite après la colonne plus(je crois que de nombreux utilisateurs ont été à la recherche de cet article), vous pouvez utiliser
EXEC sp_executesql
formé UPDATE
déclaration.La vraie réponse est que vous devez l'ajouter à la base de données que vous vérifiez contre il est donc
FROM [YourDatabase].INFORMATION_SCHEMA.COLUMNS
OriginalL'auteur Maciej | 2008-09-25
Vous devez vous connecter pour publier un commentaire.
SQL Server 2005 à partir de:
Martin Smith version est plus courte:
OriginalL'auteur Mitch Wheat
Une version plus concise
Le point sur les autorisations sur l'affichage des métadonnées s'applique à toutes les réponses et pas seulement celui-ci.
Noter que le premier paramètre nom de la table à
COL_LENGTH
peut être dans un, deux, ou trois parties d'un nom de format requis.Un exemple de la référence d'une table dans une autre base de données est
Une différence avec cette réponse par rapport à l'aide des métadonnées points de vue est que les fonctions de métadonnées telles que
COL_LENGTH
toujours retourner uniquement les données sur les commis des changements quel que soit le niveau d'isolation en vigueur.Moins lisible dans quel sens? Regarde bien dans Firefox. Cette réponse a été posté plus de 2 ans plus tard que l'on a accepté, ce qui explique la notation de l'OMI. Si vous signifiait moins clair que c'est une existence de vérifier ce type de langage est assez commun dans SQL Server. par exemple, à l'aide de
IF OBJECT_ID('TableName','U') IS NULL
pour vérifier objet existence ouDB_ID('foo')
pour vérifier la base de l'existence.Je suis sûr qu'il entend de moins en moins lisible, car si vous ne connaissez pas cet idiome, et vous avez hérité de ce code de quelqu'un d'autre, vous ne serait pas immédiatement comprendre ce que fait le code. Un peu comme l'écriture
x>>2
au lieu dex/4
en C++. Le plus prolixe de code (if exists (select column_name from information_schema ...)
) prend beaucoup plus d'espace, mais on ne l'a jamais gratter leur tête à essayer de comprendre ce qu'il fait.D'ailleurs plus concis, c'est un moyen plus rapide de la solution. L'accès
INFORMATION_SCHEMA
vues ousys.columns
hits disque, tandis queCOL_LENGTH
utilise la mise en cache de la base de données de métadonnées.Ce n'est probablement pas le plus hautement cotés réponse, car il a été donné de 2,5 ans après l'autre. C'est pourquoi j'ai toujours vérifier les dates lorsque l'on compare les cotes des deux réponses. Il faut beaucoup plus de temps pour surmonter une réponse qui a été donnée beaucoup plus tôt. 😉
OriginalL'auteur Martin Smith
Tordre le ci-dessous en fonction de vos besoins:
Modifier pour traiter les modifier à la question: travail - prendre soin de regarder par-dessus votre code d'erreurs stupides; êtes-vous d'interrogation INFORMATION_SCHEMA sur la même base de données que votre insertion est appliqué, par exemple? Avez-vous une faute de frappe dans votre table/nom de la colonne dans l'énoncé?
-1: ne pas répondre à l'OP de la question, ne fait qu'ajouter de l'information nouvelle sur la façon d'ajouter un nouveau collumn malgré l'OP ne demande pas à ce sujet, ne s'adresse pas OP du commentaire.
OriginalL'auteur Luke Bennett
...
Vous pouvez utiliser
SELECT 1
au lieu deSELECT TOP 1 1
;).Au sein d'une
EXISTS
instruction SQL optimise automatiquement les colonnes de suite (un peu commecount(*)
) doncSELECT *
suffira.OriginalL'auteur Leon Tayson
Je préfère
INFORMATION_SCHEMA.COLUMNS
sur un système de table parce que Microsoft ne garantit pas pour préserver le système de tables entre les versions. Par exemple,dbo.syscolumns
ne fonctionnent toujours dans SQL 2008, mais il est obsolète et peut être retiré à tout moment dans l'avenir.Eh bien oui, cela va sans dire depuis
INFORMATION_SCHEMA
vues contiennent uniquement de la norme ANSI métadonnées. Cependant, ce qui est suffisant pour qu'un test d'existence.Microsoft affirme que "Dans les futures versions de SQL Server, Microsoft peut augmenter la définition de l'affichage catalogue système en ajoutant des colonnes à la fin de la liste des colonnes. Nous déconseillons l'utilisation de la syntaxe SELECT * from sys.catalog_view_name dans le code de production, parce que le nombre de colonnes retournées peut changer et briser votre demande." Ce qui implique qu'ils ne seront pas supprimer des colonnes ou modifier leur ordre. C'est assez bon compatibilité descendante pour tous, mais les cas de bord.
OriginalL'auteur Christian Hayter
Vous pouvez utiliser les informations de schéma du système de points de vue à savoir beaucoup de choses sur les tables qui vous intéresse:
Vous pouvez également interroger les vues, les procédures stockées et à peu près tout sur la base de données en utilisant les vues Information_schema.
OriginalL'auteur
D'abord vérifier si le
table
/column
(id
/name
) combinaison existe dansdbo.syscolumns
(interne d'une table SQL Server qui contient des définitions de champ), et si pas de problème appropriésALTER TABLE
requête pour l'ajouter. Par exemple:OriginalL'auteur mdb
Essayez quelque chose comme:
Puis l'utiliser comme ceci:
Il devrait fonctionner sur SQL Server 2000 et SQL Server 2005. Pas sûr au sujet de SQL Server 2008, mais ne vois pas pourquoi pas.
OriginalL'auteur Matt Lacey
Pour le peuple qui est la vérification de la colonne existence de la faire tomber.
Dans SQL Server 2016 vous pouvez utiliser les nouveaux MOURIR plutôt les instructions de gros
IF
wrappersOriginalL'auteur Pரதீப்
OriginalL'auteur Tuomo Kämäräinen
Un bon ami et collègue à moi m'a montré comment vous pouvez également utiliser un
IF
bloc avec les fonctions SQLOBJECT_ID
etCOLUMNPROPERTY
dans SQL SERVER 2005+ à vérifier pour une colonne. Vous pouvez utiliser quelque chose de similaire à la suivante:Vous pouvez voir par vous-même ici
COLUMNPROPERTY
seulement.OriginalL'auteur brazilianldsjaguar
Cela a fonctionné pour moi dans SQL 2000:
OriginalL'auteur Joe M
Essayer cette
INFORMATION_SCHEMA.TABLES
et vous n'avez pas de filtre les colonnes d'une table spécifique, Donc c'est parfois le retour de plus d'une ligne pour les mêmes noms de colonnes dans des tableaux distincts ;).OriginalL'auteur Douglas Tondo
J'avais besoin similaire pour SQL SERVER 2000 et, comme @Mitch points, cela ne fonctionne que inm 2005+.
Devrait-il aider quelqu'un d'autre, c'est ce qui a fonctionné pour moi à la fin:
OriginalL'auteur FrostbiteXIII
OriginalL'auteur BYRAKUR SURESH BABU
OriginalL'auteur Na30m
OriginalL'auteur Nishad
Une table temp version de la accepté de répondre à:
Correct. La accepté de répondre ne fonctionne pas pour les tables temporaires parce que " sys.les colonnes "doit être spécifiée comme" la base de données tempdb.sys.les colonnes " et le nom de la table doit être précédé par 'tempdb..'.
OriginalL'auteur crokusek
Blé réponse est bonne, mais suppose que vous n'avez pas identique nom de la table /colonne nom paires dans tout schéma ou de la base de données. Pour le rendre sûr pour que la condition d'utiliser cette...
OriginalL'auteur Daniel Barbalace
Il y a plusieurs façons de vérifier l'existence d'une colonne.
Je vous recommande fortement d'utiliser
INFORMATION_SCHEMA.COLUMNS
comme il est créé dans le but de communiquer avec l'utilisateur.Envisager tableaux suivants:
et même de quelques autres méthodes d'accès disponibles pour vérifier
system catalog.
Aussi, pas besoin d'utiliser
SELECT *
, il suffit de le tester parNULL value
SELECT *
avecEXISTS
, parce que, quand il existe, il n'a pas vraiment d'sélectionnez toutes les lignes et toutes les colonnes, à l'interne, il vérifie juste pour l'existence et pas vraiment vérifie pour toutes les lignes et les colonnesOriginalL'auteur Ali Elmi
L'un des plus simple et compréhensible solution est:
OriginalL'auteur Arsman Ahmad
Voici un simple script que j'utilise pour gérer plus de colonnes dans la base de données:
Dans cet exemple, le
Name
est leColumnName
être ajoutées etObject_Id
est leTableName
OriginalL'auteur UJS
Ci-dessous requête peut être utilisée pour vérifier si recherché colonne existe ou pas dans le tableau. Nous pouvons prendre des décisions fondées sur les résultats de recherche également, comme illustré ci-dessous.
OriginalL'auteur Suraj Kumar
Encore une autre variante...
OriginalL'auteur Manuel Alves
OriginalL'auteur Ilangeeran