Sicuramente chi di voi ha aggiornato il proprio client di amministrazione database di casa Microsoft alla versione 2012, si sarà accorto che copiando dati estratti da query che contengono una o più interruzioni di riga (il classico invio o in gergo carriage return) su un foglio Excel, l'SSMS non ignora l'interruzione di riga come facevano le versioni del Management Studio 2008 e 2005, ma la mantiene andando a salvare su Excel le informazioni seguite da ogni carriage return su righe diverse.
Questa scelta fatta da Microsoft può essere discutibile nel senso che è vero che effettivamente se una cella del database contiene, tra gli altri caratteri, il carriage return (l'invio), durante la copia, così come vengono mantenuti gli spazi e tutto il resto della punteggiatura, è giusto che venga mantenuto anche il CR, però questo potrebbe creare problemi (o vantaggi a seconda del caso), se vogliamo andare ad incollare i dati ad esempio su un file Excel.
Creazione tabella di esempio:
declare @Anagrafe table(Test nvarchar(20))
insert into @Test(Test)
values('test' + char(13) + 'test')
Query di esempio:
select test from Anagrafe
where ID = '10000'
Risultato query:
Copia del risultato su Excel:
Questo perchè i due test erano stati inseriti a database premendo un invio tra di essi.
E' possibile risolvere l'inghippo, a meno che il risultato in questo formato non vada già bene, applicando una funzione di REPLACE, che vada appunto a sostituire i caratteri char(10) ovvero il line feed e il char(13) ovvero il carriage return con un spazio vuoto ad esempio, o qualunque altro carattere a voi sembri più consono.
Soluzione:
select REPLACE(CAST(test as varchar(MAX)), CHAR(13) + CHAR(10), ' ') from Anagrafe
where ID = '10000'
Risultato query:
Copia del risultato su Excel: