validar una tipos tabla saber restricciones restriccion registro existe ejemplos como columna check agregar sql sql-server tsql sql-server-2008 alter-table

una - tipos de restricciones en mysql



¿Agregar una columna si no existe en todas las tablas? (3)

Estoy usando SQL Server 2005/2008. Necesito agregar una columna a una tabla si aún no existe. Esto se aplicará a todas las tablas en una base de datos dada. Esperaba estar cerca, pero tengo problemas con esta solución.

¿Cómo se puede hacer esto?

Esto es lo que tengo:

EXEC sp_MSforeachtable '' declare @tblname varchar(255); SET @tblname = PARSENAME("?",1); if not exists (select column_name from INFORMATION_SCHEMA.columns where table_name = @tblname and column_name = ''''CreatedOn'''') begin ALTER TABLE @tblname ADD CreatedOn datetime NOT NULL DEFAULT getdate(); end ''

Pero me sale errores:

Error 102: Sintaxis incorrecta cerca de ''@tblname''. Sintaxis incorrecta cerca de ''CreatedOn''. Sintaxis incorrecta cerca de ''@tblname''. Sintaxis incorrecta cerca de ''CreatedOn''. ... y así sucesivamente, para cada mesa.


No puede usar variables, como @tableName, en DDL. Además, dividir el nombre en parte e ignorar el esquema solo puede dar como resultado errores. Solo debe usar el reemplazo ''''? '''' En el parámetro de lote de SQL y confiar en el reemplazo de MSforeachtable :

EXEC sp_MSforeachtable '' if not exists (select * from sys.columns where object_id = object_id(''''?'''') and name = ''''CreatedOn'''') begin ALTER TABLE ? ADD CreatedOn datetime NOT NULL DEFAULT getdate(); end'';


Tal vez así:

EXEC sp_MSforeachtable '' declare @tblname varchar(255); SET @tblname = PARSENAME("?",1); if not exists (select column_name from INFORMATION_SCHEMA.columns where table_name = @tblname and column_name = ''''CreatedOn'''') begin ALTER TABLE [?] ADD CreatedOn datetime NOT NULL DEFAULT getdate(); end ''

?

O incluso así:

EXEC sp_MSforeachtable '' if not exists (select column_name from INFORMATION_SCHEMA.columns where table_name = ''''?'''' and column_name = ''''CreatedOn'''') begin ALTER TABLE [?] ADD CreatedOn datetime NOT NULL DEFAULT getdate(); end ''


Tendrá que mezclar un poco de SQL dinámico. Esto debería funcionar:

EXEC sp_MSforeachtable '' declare @tblname varchar(255); SET @tblname = PARSENAME("?",1); declare @sql nvarchar(1000); if not exists (select column_name from INFORMATION_SCHEMA.columns where table_name = @tblname and column_name = ''''CreatedOn'''') begin set @sql = N''''ALTER TABLE '''' + @tblname + N'''' ADD CreatedOn datetime NOT NULL DEFAULT getdate();'''' exec sp_executesql @sql end ''