2012-09-06 10 views

risposta

18

aggiornare ogni antica colonna a 0, è possibile utilizzare questa query (su una base di colonna per colonna):

UPDATE MyTable 
SET OldCol1 = 0 
WHERE OldCol1 IS NULL 

Quindi, se volete qualsiasi valori futuri di avere un valore predefinito di 0 come bene, usare questo:

ALTER TABLE MyTable 
ALTER COLUMN OldCol1 bit NOT NULL 

ALTER TABLE MyTable 
ADD CONSTRAINT OldCol1ShouldBeFalse DEFAULT 0 FOR OldCol1 

Ora, dovrete eseguire questo uno contro l'antica colonna, quindi speriamo che non si dispone di troppi.

3

Questo SQL dinamico nidificato otterrà il lavoro se non si desidera eseguire questo uno per uno. Si noti che non esegue alcun controllo per verificare che la colonna non abbia già un vincolo predefinito (che è possibile, anche se la colonna è annullabile), ma lo script potrebbe essere aumentato per farlo (e anche per eliminarlo tale vincolo nel caso in cui sia predefinito 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; 

E 'davvero brutto da vedere, e il comando PRINT non sarà necessariamente completo a causa di limitazioni di uscita in Management Studio. Ma una volta che si è certi che i primi comandi sembrano giusti, è possibile commentarlo e rimuovere il commento dalla penultima riga ed eseguire nuovamente lo script per apportare le modifiche. Il GO è lì perché alcuni potrebbero fallire. È possibile aggiungere output di stampa per ciascuna combinazione db/tabella/colonna in modo da poter stampare messaggi di stato per correlare più facilmente eventuali errori con il db/tabella/colonna effettivi.