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
> 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/
===================================
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
Grazie mille,
ciao,
Simone
"Simone" <overt...@hotmail.com> ha scritto nel messaggio
news:%23vtPBgg...@TK2MSFTNGP04.phx.gbl...
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,
> 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
*/
> -- 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?
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.
Per questo non c'è problema.
io con 12 intendevo 12 caratteri senza considerare gli spazi
grazie
ciao,
Simone