Mantenere caratteri vuoti nei campi

venerdì 27 marzo 2009 - 17.46

sanzo77 Profilo | Newbie

Salve a tutti
Sto combattendo con dei tracciati di transcodifica che vengono creati a partire da un DB Sql server. La situazione è la sequente:
Devo selezionare alcuni campi di una tabella, concatenare i valori ricevuti e inserirli in un'altro campo mantenendo però una larghezza fissa per ogni valore concatenato. Faccio un esempio:
Diciamo che io faccio select a,b from t e che la select mi torna due record:
record 1 = xxx , yyy
record 2 = xxxx, zzzzzzz
Entrambi i campi devono contenere 10 caratteri, quindi nel campo finale (quello che contiene la concatenazione fra i due) voglio ottenere:
record 1 = _______xxx_______yyy
record 2 = ______xxxx___zzzzzzz
Con i caratteri di underscore che rappresentano gli spazi lasciati dai caratteri vuoti.
Qualcuno sa come posso fare?
Aggiungo un grado di difficoltà alla cosa: potrei dover mantenere gli spazi o a sinistra o a destra (ovviamente a seconda del campo).
Grazie a tutti per le eventuali risposte

lbenaglia Profilo | Guru

>Salve a tutti
>Sto combattendo con dei tracciati di transcodifica che vengono
>creati a partire da un DB Sql server. La situazione è la sequente:
>Devo selezionare alcuni campi di una tabella, concatenare i valori
>ricevuti e inserirli in un'altro campo mantenendo però una larghezza
>fissa per ogni valore concatenato. Faccio un esempio:
>Diciamo che io faccio select a,b from t e che la select mi torna
>due record:
>record 1 = xxx , yyy
>record 2 = xxxx, zzzzzzz
>Entrambi i campi devono contenere 10 caratteri, quindi nel campo
>finale (quello che contiene la concatenazione fra i due) voglio
>ottenere:
>record 1 = _______xxx_______yyy
>record 2 = ______xxxx___zzzzzzz
>Con i caratteri di underscore che rappresentano gli spazi lasciati
>dai caratteri vuoti.
>Qualcuno sa come posso fare?

Ciao,

Ci aiuti a capire da dove deriva tale esigenza?
Perché devi valorizzare una nuova colonna?
Non puoi generare "al volo" la concatenazione che ti serve? In questo modo eviti di dover riaggiornare la nuova colonna ogni qual volta aggiorni uno dei due campi che intendi concatenare.
In alternativa potresti ricorrere ad una colonna calcolata come nel seguente esempio:

USE tempdb; CREATE TABLE dbo.Students( StudentID int NOT NULL IDENTITY PRIMARY KEY, FirstName varchar(10) NOT NULL, LastName varchar(10) NOT NULL, FullName AS RIGHT(SPACE(10) + FirstName, 10) + RIGHT(SPACE(10) + LastName, 10) ); INSERT dbo.Students VALUES ('Lorenzo', 'Benaglia') , ('Luca', 'Bianchi') , ('Andrea', 'Montanari'); SELECT * FROM dbo.Students; /* Output: StudentID FirstName LastName FullName ----------- ---------- ---------- -------------------- 1 Lorenzo Benaglia Lorenzo Benaglia 2 Luca Bianchi Luca Bianchi 3 Andrea Montanari Andrea Montanari (3 row(s) affected) */ DROP TABLE dbo.Students;

Se utilizzi SQL Server 2005+ volendo puoi materializzare la colonna calcolata nelle data pages che costituiscono la tabella pecificando la clausola PERSISTED.
Per ulteriori dettagli consulta i Books Online.

>Grazie a tutti per le eventuali risposte
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

sanzo77 Profilo | Newbie

In effetti posso anche calcolare al volo la vista, non c'è bisogno di renderla persistente... cmq ottimo il discorso del RIGHT, lunedì quando vado al lavoro provo. Per ora mi ero dato da fare con il cast a nchar che sembra funzionare... salvo il fatto che mi converte in automatico le date (cosa che io non voglio), anzi se avete consigli su come prevenire questo comportamento sono graditi (la data di oggi 20090327 me la rappresenta automaticamente mar 27 2009 o roba del genere, ora non ricordo).

Grazie ancora.

lbenaglia Profilo | Guru

>Per ora mi ero dato da fare
>con il cast a nchar che sembra funzionare... salvo il fatto che
>mi converte in automatico le date (cosa che io non voglio), anzi
>se avete consigli su come prevenire questo comportamento sono
>graditi (la data di oggi 20090327 me la rappresenta automaticamente
>mar 27 2009 o roba del genere, ora non ricordo).

Per castare le date a stringa specificando lo stile desiderato utilizza la funzione CONVERT() di cui trovi ampia documentazione sui Books Online.
Se ad esempio volessi castare la data odierna in una stringa nel formato YYYYMMDD, potrei utilizzare la seguente sintassi:

SELECT CONVERT(char(8), CURRENT_TIMESTAMP, 112) AS Data; /* Output: Data -------- 20090327 (1 row(s) affected) */

>Grazie ancora.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

sanzo77 Profilo | Newbie

Grazie mille!!!!

sanzo77 Profilo | Newbie

Ok, il convert ha funzionato alla perfezione e per mantenere la lunghezza dei campi per adesso ho usato nchar... se dovessi aver bisogno di variare l'allineamento userò il suggerimento di Benaglia.
Grazie ancora.

Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5