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
''