Question Comment vérifier si une colonne existe dans une table SQL Server?
J'ai besoin d'ajouter une colonne spécifique si elle n'existe pas. J'ai quelque chose comme le suivant, mais il renvoie toujours faux:
IF EXISTS(SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTableName'
AND COLUMN_NAME = 'myColumnName')
Comment puis-je vérifier si une colonne existe dans une table de la base de données SQL Server?
1567
2017-09-25 12:34
origine
Réponses:
SQL Server 2005 à partir de:
IF EXISTS(SELECT 1 FROM sys.columns
WHERE Name = N'columnName'
AND Object_ID = Object_ID(N'schemaName.tableName'))
BEGIN
-- Column Exists
END
La version de Martin Smith est plus courte:
IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
-- Column Exists
END
1722
2017-09-25 12:39
Une version plus concise
IF COL_LENGTH('table_name','column_name') IS NULL
BEGIN
/*Column does not exist or caller does not have permission to view the object*/
END
Le point concernant les autorisations d'affichage des métadonnées s'applique à toutes les réponses, pas seulement celle-ci.
Notez que le nom du premier tableau de paramètres à COL_LENGTH
peut être au format un, deux ou trois noms de partie, selon les besoins.
Un exemple référençant une table dans une base de données différente est
COL_LENGTH('AdventureWorks2012.HumanResources.Department','ModifiedDate')
Une différence avec cette réponse par rapport à l'utilisation des vues de métadonnées est que les fonctions de métadonnées telles que COL_LENGTH
toujours uniquement renvoyer des données sur les modifications validées quel que soit le niveau d'isolement en vigueur.
853
2018-03-20 14:47
Tweak ci-dessous pour répondre à vos besoins spécifiques:
if not exists (select
column_name
from
INFORMATION_SCHEMA.columns
where
table_name = 'MyTable'
and column_name = 'MyColumn')
alter table MyTable add MyColumn int
Modifier pour traiter avec modifier à question: Cela devrait fonctionner - regardez attentivement votre code pour les erreurs stupides; interrogez-vous INFORMATION_SCHEMA sur la même base de données lorsque votre insertion est appliquée par exemple? Avez-vous une faute de frappe dans votre nom de table / colonne dans l'une ou l'autre des déclarations?
125
2017-09-25 12:35
Essaye ça...
IF NOT EXISTS(
SELECT TOP 1 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
[TABLE_NAME] = 'Employees'
AND [COLUMN_NAME] = 'EmployeeID')
BEGIN
ALTER TABLE [Employees]
ADD [EmployeeID] INT NULL
END
63
2017-09-25 12:35
je préfèrerais INFORMATION_SCHEMA.COLUMNS
sur une table système car Microsoft ne garantit pas la préservation des tables système entre les versions. Par exemple, dbo.syscolumns
fonctionne toujours dans SQL 2008, mais il est obsolète et pourrait être supprimé à tout moment à l'avenir.
43
2018-06-26 08:58
Vous pouvez utiliser les vues du système de schéma d'informations pour en savoir plus sur les tables qui vous intéressent:
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
ORDER BY ORDINAL_POSITION
Vous pouvez également interroger des vues, des procédures stockées et à peu près tout ce qui concerne la base de données en utilisant les vues Information_schema.
38
2017-09-25 12:37
Vérifiez d'abord si le table
/column
(id
/name
) existe dans dbo.syscolumns
(une table SQL Server interne qui contient des définitions de champ) et, si ce n'est pas le cas, ALTER TABLE
requête pour l'ajouter. Par exemple:
IF NOT EXISTS ( SELECT *
FROM syscolumns
WHERE id = OBJECT_ID('Client')
AND name = 'Name' )
ALTER TABLE Client
ADD Name VARCHAR(64) NULL
28
2017-09-25 12:38
Essayez quelque chose comme:
CREATE FUNCTION ColumnExists(@TableName varchar(100), @ColumnName varchar(100))
RETURNS varchar(1) AS
BEGIN
DECLARE @Result varchar(1);
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = @TableName AND COLUMN_NAME = @ColumnName)
BEGIN
SET @Result = 'T'
END
ELSE
BEGIN
SET @Result = 'F'
END
RETURN @Result;
END
GO
GRANT EXECUTE ON [ColumnExists] TO [whoever]
GO
Alors utilisez-le comme ceci:
IF ColumnExists('xxx', 'yyyy') = 'F'
BEGIN
ALTER TABLE xxx
ADD yyyyy varChar(10) NOT NULL
END
GO
Il devrait fonctionner à la fois sur SQL Server 2000 et SQL Server 2005. Vous n'êtes pas sûr de SQL Server 2008, mais vous ne voyez pas pourquoi.
26
2018-05-01 04:46
Pour les personnes qui vérifient l'existence de la colonne pour le laisser tomber.
Dans SQL Server 2016 vous pouvez utiliser de nouvelles déclarations DIE au lieu de grandes IF
emballages
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
24
2018-03-03 15:49
declare @myColumn as nvarchar(128)
set @myColumn = 'myColumn'
if not exists (
select 1
from information_schema.columns columns
where columns.table_catalog = 'myDatabase'
and columns.table_schema = 'mySchema'
and columns.table_name = 'myTable'
and columns.column_name = @myColumn
)
begin
exec('alter table myDatabase.mySchema.myTable add'
+' ['+@myColumn+'] bigint null')
end
22
2018-03-20 22:27
Un bon ami et un de mes collègues m'a montré comment vous pouvez également utiliser un IF
bloquer avec des fonctions SQL OBJECT_ID
et COLUMNPROPERTY
dans SQL Server 2005+ pour vérifier une colonne. Vous pouvez utiliser quelque chose de similaire à ce qui suit:
Vous pouvez voir par vous-même ici
IF (OBJECT_ID(N'[dbo].[myTable]') IS NOT NULL AND
COLUMNPROPERTY( OBJECT_ID(N'[dbo].[myTable]'), 'ThisColumnDoesNotExist', 'ColumnId') IS NULL)
BEGIN
SELECT 'Column does not exist -- You can add TSQL to add the column here'
END
21
2017-08-02 19:54