2009-12-03 14 views

risposta

14

Qui, per iniziare:

Select 'Alter Table [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '] Alter Column [' + COLUMN_NAME + '] VarChar(' + CAST(CHARACTER_MAXIMUM_LENGTH As VARCHAR) + ')' 
From INFORMATION_SCHEMA.COLUMNS 
WHERE DATA_TYPE = 'NVARCHAR' 

Questo genererà tutte le dichiarazioni alter necessari per voi (tagliare, incollare, eseguire).

Si noti che questo non tiene conto di alcun vincolo.

+1

+1 perfetto. Ho ottenuto la stessa soluzione ... ma con una query molto molto brutta e complicata ... – Jonathan

+0

+1 Tecnica impressionante :-) –

+0

@Jonathan Come uso il codice in questa risposta per "generare tutte le necessarie modifiche" in SSQL Management Studio in modo che io possa "tagliare, incollare, eseguire"? –

3

Chiedi all'archivio dati di farlo?

o

generare uno script di tutti gli oggetti nel vostro sistema, alterare poi nvarchar di, quindi creare un nuovo database e importare i dati in esso da quello vecchio.

o

Scrivi modificare gli script per aggiornare il database esistente.
(. Questo potrebbe essere l'approccio migliore se si tratta di un database di produzione, o di un database client)

+4

Assecondare "chiedono i dati arco di farlo". –

+0

Non dimenticare di controllare prima di vedere se ci sono dati che non verranno convertiti in varchar. Sono d'accordo se l'architetto dei dati vuole questo, sta a lui scrivere gli script per farlo. – HLGEM

4

Al fine di gestire MAX ed escludere le sysdiagrams alle questioni più spinose:

SELECT 
' 
ALTER TABLE [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '] 
ALTER COLUMN [' + COLUMN_NAME + '] 
VARCHAR(' + 
    (CASE WHEN CHARACTER_MAXIMUM_LENGTH = -1 
     THEN 'MAX' 
     ELSE CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) 
    END) 
+ ') 
' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE DATA_TYPE = 'NVARCHAR' AND TABLE_NAME <> 'SYSDIAGRAMS' 
Problemi correlati