2012-09-06 11 views

Respuesta

18

Para actualizar cada columna de edad a 0, puede utilizar esta consulta (sobre una base de la columna por columna):

UPDATE MyTable 
SET OldCol1 = 0 
WHERE OldCol1 IS NULL 

Entonces, si usted quiere cualquier valores futuros a tener un valor predeterminado de 0 como así, utilice esto:

ALTER TABLE MyTable 
ALTER COLUMN OldCol1 bit NOT NULL 

ALTER TABLE MyTable 
ADD CONSTRAINT OldCol1ShouldBeFalse DEFAULT 0 FOR OldCol1 

Ahora, usted tiene que ejecutar esto en contra de cada columna de edad, así que espero que usted no tiene demasiados.

3

Este SQL dinámico anidado logrará el trabajo si no desea hacer esto uno por uno. Tenga en cuenta que no hace ninguna comprobación primero para validar que la columna ya no tiene una restricción predeterminada (que es posible, incluso si la columna es anulable), pero la secuencia de comandos podría aumentarse para hacerlo (e incluso para descartar) tal restricción en caso de que sea por defecto 1).

DECLARE @sql NVARCHAR(MAX); 
SET @sql = N'DECLARE @sql NVARCHAR(MAX); SET @sql = N'''';'; 

SELECT @sql = @sql + N' 
    SELECT @sql = @sql + N''UPDATE ' + QUOTENAME(name) 
    + '.'' + QUOTENAME(s.name) + ''.'' + QUOTENAME(t.name) + '' 
    SET '' + QUOTENAME(c.name) + '' = 0 
    WHERE '' + QUOTENAME(c.name) + '' IS NULL; 

    ALTER TABLE ' + QUOTENAME(name) + '.'' + QUOTENAME(s.name) 
    + ''.'' + QUOTENAME(t.name) 
    + '' ADD CONSTRAINT '' + c.name + ''_FalseByDefault 
    DEFAULT (0) FOR '' + QUOTENAME(c.name) + ''; 

    ALTER TABLE ' + QUOTENAME(name) + '.'' + QUOTENAME(s.name) 
    + ''.'' + QUOTENAME(t.name) 
    + '' ALTER COLUMN '' + QUOTENAME(c.name) + '' BIT NOT NULL; 
    '' 

FROM ' + QUOTENAME(name) + '.sys.columns AS c 
INNER JOIN ' + QUOTENAME(name) + '.sys.tables AS t 
ON c.[object_id] = t.[object_id] 
INNER JOIN ' + QUOTENAME(name) + '.sys.schemas AS s 
ON t.[schema_id] = s.[schema_id] 
WHERE c.system_type_id = 104 AND c.is_nullable = 1 
AND t.is_ms_shipped = 0;' 
FROM sys.databases WHERE database_id > 4; 

SET @sql = @sql + 'PRINT @sql; 
    --EXEC sp_executesql @sql;'; 

EXEC sp_executesql @sql; 

Es muy feo a la vista, y el comando PRINT no será necesariamente completa debido a las limitaciones de salida en Management Studio. Pero una vez que esté seguro de que los primeros comandos parecen correctos, puede comentarlos y descomentar la segunda línea y ejecutar el script nuevamente para realizar los cambios. El GO está ahí porque algunos pueden fallar. Es posible que desee agregar resultados de impresión para cada combinación de db/tabla/columna, de modo que pueda imprimir mensajes de estado para correlacionar más fácilmente cualquier posible error con el db/tabla/columna real.

Cuestiones relacionadas