2012-01-15 20 views
113

Quiero escribir una consulta para MS SQL Server que agrega una columna en una tabla. Pero no deseo que se muestre ningún error cuando ejecuto/ejecuto la siguiente consulta.Agregue una columna a una tabla, si no existe

estoy usando este tipo de consulta para agregar una tabla ...

IF EXISTS (
     SELECT * 
     FROM sys.objects 
     WHERE OBJECT_ID = OBJECT_ID(N'[dbo].[Person]') 
       AND TYPE IN (N'U') 
    ) 

Pero no sé cómo escribir esta consulta para una columna.

+0

posible duplicado de [Cómo verificar si la columna exis ts en la tabla de SQL Server] (http://stackoverflow.com/questions/133031/how-to-check-if-column-exists-in-sql-server-table) –

+0

Debe usar 'sys.tables' en lugar de el 'genérico '' sys.objects' - entonces no tiene que especificar el tipo explícitamente (ya es obvio desde 'sys.tables' ....) –

+0

COL_LENGTH La alternativa solo funciona desde SQL-Server 2008, pero trabajos. –

Respuesta

132

Puede usar una construcción similar utilizando la tabla sys.columns io sys.objects.

IF EXISTS (
    SELECT * 
    FROM sys.columns 
    WHERE object_id = OBJECT_ID(N'[dbo].[Person]') 
     AND name = 'ColumnName' 
) 
+37

Tenga en cuenta que en esta instancia desea utilizar SI NO EXISTE en su código actual. – Nat

+1

¿funcionaría esto en MS SQL 2005? – guiomie

+2

Para una consulta optimizada puede usar top 1 con la instrucción select –

28

Otra alternativa. Prefiero este enfoque porque es menos escribir, pero los dos logran lo mismo.

IF COLUMNPROPERTY(OBJECT_ID('dbo.Person'), 'ColumnName', 'ColumnId') IS NULL 
BEGIN 
    ALTER TABLE Person 
    ADD ColumnName VARCHAR(MAX) NOT NULL 
END 

También me di suyo está buscando en la tabla existe que es, obviamente, sólo esta

if COLUMNPROPERTY(OBJECT_ID('dbo.Person'),'ColumnName','ColumnId') is not null 
+9

[O para escribir aún menos] (http://stackoverflow.com/a/5369176/73226) –

+2

Me gusta. Creo que la mejor parte de publicar aquí es encontrar gemas como esta. – JStead

45
IF COL_LENGTH('table_name', 'column_name') IS NULL 
BEGIN 
    ALTER TABLE table_name 
    ADD [column_name] INT 
END 
+1

Intenté hacer esto pero devuelve un error que indica que la función COL_LENGTH no existe. – ThEpRoGrAmMiNgNoOb

+0

Requiere SQL Server 2008+ – Rob

+0

Pequeña adición: no se deben usar corchetes en el nombre de la columna, ya que 'COL_LENGTH ('table_name', '[column_name]')' siempre devuelve null en SQL Server 2016 ('COL_LENGTH ('[ table_name] ',' column_name ') funciona como se esperaba'). –

3

/* COMPROBAR LA EXISTENCIA DE LA columna de la tabla */

IF COL_LENGTH('TABLE_NAME','COLUMN_NAME') IS NULL 
BEGIN 
ALTER TABLE .... /*COLUMN DOES NOT EXIST OR CALLER DOES NOT HAVE PERMISSION TO VIEW THE OBJECT*/ 
END 
0
IF NOT EXISTS (SELECT 1 FROM SYS.COLUMNS WHERE 
OBJECT_ID = OBJECT_ID(N'[dbo].[Person]') AND name = 'DateOfBirth') 
BEGIN 
ALTER TABLE [dbo].[Person] ADD DateOfBirth DATETIME 
END 
Cuestiones relacionadas