Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Aggiungere zeri a un campo

3,108 views
Skip to first unread message

Simone

unread,
Apr 27, 2006, 10:36:40 AM4/27/06
to
Buongiorno,

in una tabella ho un campo testo nel quale ho messo dei valori.

avrei bisogno che tutti questi valori siano di 12 caratteri e dove non lo
sono dovrei aggiungere 'n' zeri prima del campo.

Es. dove c'è 1234 deve diventare 000000001234


come posso fare a fare un update?

grazie mille,

ciao,

Simone


Sandro Bizioli

unread,
Apr 27, 2006, 10:52:24 AM4/27/06
to
Il /27 apr 2006/, *Simone* ha scritto:

> Buongiorno,
>
> in una tabella ho un campo testo nel quale ho messo dei valori.
>
> avrei bisogno che tutti questi valori siano di 12 caratteri e dove
> non lo sono dovrei aggiungere 'n' zeri prima del campo.
>
> Es. dove c'è 1234 deve diventare 000000001234
>

SET NOCOUNT ON
--Mi posiziono sul tempDB
use tempDB

-- Creo una tabella di prova
Create Table myTable
(
myNumber varchar(12)
)

-- La popolo con dei valori
Insert into myTable values('1234')
Insert into myTable values('12')
Insert into myTable values('2')
Insert into myTable values('123456789012')

-- Aggiorno i campi aggiungendo gli zeri necessari
update myTable
set myNumber = right('000000000000' + myNumber ,12)

--Recupero i valori
select * from myTable

-- Elimino la tabella
drop table myTable

SET NOCOUNT OFF

--
===================================
Sandro Bizioli
http://blogs.dotnethell.it/sandro/
===================================

Lorenzo Benaglia

unread,
Apr 27, 2006, 10:56:22 AM4/27/06
to
Simone wrote:
> in una tabella ho un campo testo nel quale ho messo dei valori.
>
> avrei bisogno che tutti questi valori siano di 12 caratteri e dove
> non lo sono dovrei aggiungere 'n' zeri prima del campo.
>
> Es. dove c'è 1234 deve diventare 000000001234
>
> come posso fare a fare un update?

Ciao Simone,

Guarda il seguente esempio:

USE tempdb;
GO

/* Definisco la tabella dbo.Clienti */
CREATE TABLE dbo.Clienti(
ClienteID varchar(4) NOT NULL,
Nome varchar(10) NOT NULL,
CONSTRAINT PK_Clienti PRIMARY KEY(ClienteID)
);
GO

/* La popolo */
INSERT dbo.Clienti VALUES('1', 'Lorenzo');
INSERT dbo.Clienti VALUES('10', 'Andrea');
INSERT dbo.Clienti VALUES('100', 'Luca');
INSERT dbo.Clienti VALUES('1000', 'Gianluca');
GO

/* 1) Elimino i constraint presenti sulla colonna ClienteID */
ALTER TABLE dbo.Clienti
DROP CONSTRAINT PK_Clienti;
GO

/* 2) Modifico le dimensioni della colonna ClienteID */
ALTER TABLE dbo.Clienti
ALTER COLUMN ClienteID varchar(12) NOT NULL;
GO

/* 3) Riaggiungo la PK sulla colonna ClienteID */
ALTER TABLE dbo.Clienti
ADD CONSTRAINT PK_Clienti PRIMARY KEY(ClienteID);
GO

/* 4) Aggiungo gli zeri a SX */
UPDATE dbo.Clienti
SET ClienteID = RIGHT('000000000000' + ClienteID, 12);
GO

/* Vediamo... */
SELECT *
FROM dbo.Clienti;
GO

/* Output:

ClienteID Nome
------------ ----------
000000000001 Lorenzo
000000000010 Andrea
000000000100 Luca
000000001000 Gianluca

(4 row(s) affected)

*/

/* Pulizia */
DROP TABLE dbo.Clienti;

> grazie mille,
Prego.

Ciao!

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


Simone

unread,
Apr 27, 2006, 11:11:15 AM4/27/06
to
Purtroppo il campo è char(15) e non varchar e quindi ci sono gli spazi e non
funziona,
anche se il campo è di 15 caratteri devo comunque averne 12 effettivi

Grazie mille,

ciao,

Simone
"Simone" <overt...@hotmail.com> ha scritto nel messaggio
news:%23vtPBgg...@TK2MSFTNGP04.phx.gbl...

Lorenzo Benaglia

unread,
Apr 27, 2006, 11:17:40 AM4/27/06
to
Simone wrote:
> Purtroppo il campo è char(15) e non varchar e quindi ci sono gli
> spazi e non funziona,
> anche se il campo è di 15 caratteri devo comunque averne 12 effettivi

Non li avrai mai :-D
Che tu inserisca 1 o 15 caratteri lo spazio allocato (e quindi i caratteri
restituiti) saranno sempre 15.
La differenza tra char e varchar è spiegata in modo ineccepibile sui Books
Online...

> Grazie mille,

Sandro Bizioli

unread,
Apr 27, 2006, 11:22:17 AM4/27/06
to
Il /27 apr 2006/, *Simone* ha scritto:

> Purtroppo il campo è char(15) e non varchar e quindi ci sono gli
> spazi e non funziona,
> anche se il campo è di 15 caratteri devo comunque averne 12
> effettivi

Modificando varchar in char(15) ed aggiungendoci un replace, dovrebbe
essere ok. Che ne dici?

set nocount on
use tempDB

-- Creo una tabella di prova
Create Table myTable
(

myNumber char(15)
)

-- La popolo con dei valori
Insert into myTable values('1234')
Insert into myTable values('12')
Insert into myTable values('2')
Insert into myTable values('123456789012')

-- Aggiorno i campi aggiungendo gli zeri necessari
update myTable

set myNumber = right('000000000000' + replace(myNumber,' ','')
,12)

--Recupero i valori
select * from myTable

-- Elimino la tabella
drop table myTable

set nocount off


/* OUTPUT
myNumber
---------------
000000001234
000000000012
000000000002
123456789012
*/

Lorenzo Benaglia

unread,
Apr 27, 2006, 11:49:14 AM4/27/06
to
Sandro Bizioli wrote:
> Modificando varchar in char(15) ed aggiungendoci un replace, dovrebbe
> essere ok. Che ne dici?

> -- Aggiorno i campi aggiungendo gli zeri necessari


> update myTable
> set myNumber = right('000000000000' + replace(myNumber,' ','')
> ,12)

Io preferirei questo:

UPDATE dbo.Clienti
SET ClienteID = RIGHT('000000000000' + CAST(CAST(ClienteID AS int) AS
varchar), 12);
GO

ma ad ogni modo se la colonna è definita come char(15) non ci sono Santi che
tengano, in output avrai i tuoi 12 caratteri + 3 blank.

USE tempdb;
GO

/* Definisco la tabella dbo.Clienti */
CREATE TABLE dbo.Clienti(

ClienteID char(4) NOT NULL,


Nome varchar(10) NOT NULL,
CONSTRAINT PK_Clienti PRIMARY KEY(ClienteID)
);
GO

/* La popolo */
INSERT dbo.Clienti VALUES('1', 'Lorenzo');
INSERT dbo.Clienti VALUES('10', 'Andrea');
INSERT dbo.Clienti VALUES('100', 'Luca');
INSERT dbo.Clienti VALUES('1000', 'Gianluca');
GO

/* 1) Elimino i constraint presenti sulla colonna ClienteID */
ALTER TABLE dbo.Clienti
DROP CONSTRAINT PK_Clienti;
GO

/* 2) Modifico le dimensioni della colonna ClienteID */
ALTER TABLE dbo.Clienti

ALTER COLUMN ClienteID char(15) NOT NULL;
GO

/* 3) Riaggiungo la PK sulla colonna ClienteID */
ALTER TABLE dbo.Clienti
ADD CONSTRAINT PK_Clienti PRIMARY KEY(ClienteID);
GO

/* 4) Aggiungo gli zeri a SX */
UPDATE dbo.Clienti

SET ClienteID = RIGHT('000000000000' + CAST(CAST(ClienteID AS int) AS
varchar), 12);
GO

/* Vediamo... */
SELECT '''' + ClienteID + '''' AS ClienteID, Nome
FROM dbo.Clienti;
GO

/* Output:

ClienteID Nome
----------------- ----------


'000000000001 ' Lorenzo
'000000000010 ' Andrea
'000000000100 ' Luca
'000000001000 ' Gianluca

(4 row(s) affected)

*/

/* Pulizia */
DROP TABLE dbo.Clienti;


L'unico modo per aggirare l'ostacolo sarebbe quello di impostare l'opzione
SET ANSI_PADDING OFF e definire la colonna ClienteID come NULL:

USE tempdb;
GO

SET ANSI_PADDING OFF;
GO

/* Definisco la tabella dbo.Clienti */
CREATE TABLE dbo.Clienti(

ClienteID char(15) NULL,
Nome varchar(10) NOT NULL
);
GO

/* La popolo */
INSERT dbo.Clienti VALUES('1', 'Lorenzo');
INSERT dbo.Clienti VALUES('10', 'Andrea');
INSERT dbo.Clienti VALUES('100', 'Luca');
INSERT dbo.Clienti VALUES('1000', 'Gianluca');
GO

/* Aggiungo gli zeri a SX */
UPDATE dbo.Clienti
SET ClienteID = RIGHT('000000000000' + CAST(CAST(ClienteID AS int) AS
varchar), 12);
GO

/* Vediamo... */
SELECT '''' + ClienteID + '''' AS ClienteID, Nome
FROM dbo.Clienti;
GO

/* Output:

ClienteID Nome
----------------- ----------


'000000000001' Lorenzo
'000000000010' Andrea
'000000000100' Luca
'000000001000' Gianluca

(4 row(s) affected)

*/

/* Pulizia */
DROP TABLE dbo.Clienti;

Ma è una forzatura bella e buona!
Perché utilizzare un data type per il compito sbagliato?

Sandro Bizioli

unread,
Apr 27, 2006, 12:00:08 PM4/27/06
to
Il /27 apr 2006/, *Lorenzo Benaglia* ha scritto:

Prima di tutto complimenti per lo stile sobrio e preciso (come sempre)

Effettivamente non se ne esce, se il campo č char(15) non se ne esce.

Non so il motivo di tale aggiornamento, ma a questo punto sarebbe piů
appropriato, forse, un cambio radicale sul formato da char(15) a int e
successivamente estrarre i dati tramite una sp o una vista che li
rielaborano nel formato che si vuole.

Simone

unread,
Apr 27, 2006, 12:05:26 PM4/27/06
to

"Lorenzo Benaglia" <lben...@despammed.com> ha scritto nel messaggio
news:4bc7gpF...@individual.net...

> Sandro Bizioli wrote:
> > Modificando varchar in char(15) ed aggiungendoci un replace, dovrebbe
> > essere ok. Che ne dici?
>
> > -- Aggiorno i campi aggiungendo gli zeri necessari
> > update myTable
> > set myNumber = right('000000000000' + replace(myNumber,' ','')
> > ,12)
>
> Io preferirei questo:
>
> UPDATE dbo.Clienti
> SET ClienteID = RIGHT('000000000000' + CAST(CAST(ClienteID AS int) AS
> varchar), 12);
> GO
>
> ma ad ogni modo se la colonna è definita come char(15) non ci sono Santi
che
> tengano, in output avrai i tuoi 12 caratteri + 3 blank.

Per questo non c'è problema.

io con 12 intendevo 12 caratteri senza considerare gli spazi

grazie


ciao,

Simone


0 new messages