2012-05-15 20 views
18

Ho letto solo l'accesso ad alcuni database SQL Sever 2008 R2 e ho bisogno di copiare i dati da alcune delle sue tabelle alle tabelle nel mio database; entrambi i database hanno le stesse regole di confronto.Conversione tra testo e varchar (MAX) in SQL Server

Il database di origine utilizza molte colonne del tipo di dati text. Posso tranquillamente creare le colonne di destinazione nel mio database di tipo varchar(MAX) e copiare i dati senza alcun rischio (sto usando le istruzioni INSERT per copiare i dati)?

In altre parole, posso copiare in modo sicuro i dati di stringa dalla colonna del tipo text alla colonna di varchar(MAX)? Entrambe le colonne utilizzano le stesse regole di confronto.

+0

Nota: dopo di noi avvertimento per anni - MS hanno effettivamente rimosso tipo TEXT per 'SQL Data Warehouse' in the cloud. È ancora disponibile per 'Database SQL di Azure' ma il data warehouse super-high-end lo ha rimosso: https://docs.microsoft.com/en-us/azure/sql-data-warehouse/sql-data-warehouse -tables-data-types –

risposta

33

Sì, sicuramente - VARCHAR(MAX) è il tipo da utilizzare in ogni caso. L'implementazione sottostante di entrambi i tipi è essenzialmente la stessa (su dati sufficientemente grandi o dopo un cambio di tipo da testo a VARCHAR(MAX)), se ti preoccupi di ciò.

È anche possibile "convertire" una colonna esistente di tipo TEXT-VARCHAR(MAX) mediante:

ALTER TABLE dbo.YourTableHere 
ALTER COLUMN YourTextColumnHere VARCHAR(MAX) 

Questo si trasformerà la vostra colonna TEXT in una colonna VARCHAR(MAX), senza alcuna perdita di dati.

Provalo! (su un copia del database esistente prima, ovviamente)

+0

è davvero sicuro farlo. Cosa succede se la colonna 'text' è più grande della colonna' varchar (max) '. Non taglieresti il ​​testo allora? – Arion

+2

Sì, è sicuro. 'NVARCHAR (max)' non è 'NVARCHAR (4000)'. Non esiste un limite di lunghezza con 'NVARCHAR (max)'. –

+1

Ok. Quindi un semplice test. In questo modo: 'DECLARE @text VARCHAR (MAX); SET @ text = REPLICATE ('0,', 200000); SELECT DATALENGTH (@text);'. Puoi spiegare perché DATALENGTH restituisce 8000? – Arion

Problemi correlati