none
Query per fare update di parte del record. RRS feed

  • Domanda

  • Salve a tutti, ho un database Sql express abbastanza popolato, ricontrollando, ho notato che 9984 righe presentano un dato errato all'interno del varchar .

    Per spiegarmi megli faccio un esempio:

    Numero       Codice Display          Codice Box          Codice Pallet

    1                 TD0000000001      TB0000000001    TP0000000001

    In pratica si tratta di codici che identificano un display all'interno di un box all'interno di un pallet, questi codici come potete evincere dall'esempio, sono stringhe di 12 caratteri che iniziano per 'T' e a seconda che si tratti di Display, Box o Pallet, cambia la seconda lettera del prefisso, D per display B per box e P per pallet.

    Il mio problema e che a causa di un errore del programma, che mi inserisce i record, attualmente  nel database ho 9984 righe che nella colonna Codice Box riportano records che iniziano con la TD invece che TB come dovrebbero.

    In sostanza, mi chiedevo se era possibile fare una query di update parziale di un record, qualcosa del genere: SET [codicebox]= '?B??????????' where [codicebox] like '%D%' in modo da sostituire solo la D con la B, dato che l'iniziale è sempre T potrei anche sostituire TD con TB...

    venerdì 3 gennaio 2014 17:05

Risposte

  • ho risolto il problema utilizzando l'operatore replace

    nel mio caso ho fatto così:

    Set [CodiceDisplay] = replace(codicedisplay, '2649DP0', '2649DP')

    WHERE [NomeNumeroLavorazione]='xxxxxx' and [NumeroProgressivo] between '544927' and '545084'

    venerdì 7 febbraio 2014 11:44
  • salve,

    per nostra "fortuna", le assegnazioni in ambiente SQL sono atomiche e non "consecutive" da destra verso sinistra o viceversa come invece avviene solitamente supportato dai linguaggi di programmazione...

    questo significa che puoi tranquillamente eseguire l'operazione senza passare per una variabile di swap tipica dei linguaggi di programmazione, e scriverai, trivialmente

    SET NOCOUNT ON;
    USE tempdb;
    GO
    CREATE TABLE dbo.t (
    	Id int NOT NULL,
    	CodiceDisplay varchar(12),
    	CodiceBox varchar(12),
    	CodicePallet  varchar(12)
    	);
    GO
    INSERT INTO dbo.t
    	VALUES ( 1, 'TD0000000001', 'TB0000000001', 'TP0000000001'); --OK
    INSERT INTO dbo.t
    	VALUES ( 2, 'TD0000000002', 'TP0000000002', 'TB0000000002'); --NO
    INSERT INTO dbo.t
    	VALUES ( 3, 'TD0000000003', 'TB0000000003', 'TP0000000003'); --OK
    INSERT INTO dbo.t
    	VALUES ( 4, 'TD0000000004', 'TP0000000004', 'TB0000000004'); --NO
    GO
    SELECT *
    	FROM dbo.t;
    GO
    UPDATE dbo.t
    	SET CodiceBox = CodicePallet
    		, CodicePallet = CodiceBox
    	WHERE LEFT(CodiceBox, 2) = 'TP' AND LEFT(CodicePallet, 2) = 'TB';
    GO
    SELECT *
    	FROM dbo.t;
    GO
    DROP TABLE dbo.t;
    --<-------------
    Id          CodiceDisplay CodiceBox    CodicePallet
    ----------- ------------- ------------ ------------
    1           TD0000000001  TB0000000001 TP0000000001
    2           TD0000000002  TP0000000002 TB0000000002
    3           TD0000000003  TB0000000003 TP0000000003
    4           TD0000000004  TP0000000004 TB0000000004
    
    Id          CodiceDisplay CodiceBox    CodicePallet
    ----------- ------------- ------------ ------------
    1           TD0000000001  TB0000000001 TP0000000001
    2           TD0000000002  TB0000000002 TP0000000002
    3           TD0000000003  TB0000000003 TP0000000003
    4           TD0000000004  TB0000000004 TP0000000004

    dove l'assegnazione prevede di caricare la colonna CodiceBox con il valore di CodicePallet e viceversa...

    saluti "atomici"


    http://www.hotelsole.com/asql/index.php - DbaMgr2k - DbaMgr and further SQL Tools http://www.hotelsole.com/

    venerdì 3 gennaio 2014 18:05
    Moderatore

Tutte le risposte

  • salve,

    per nostra "fortuna", le assegnazioni in ambiente SQL sono atomiche e non "consecutive" da destra verso sinistra o viceversa come invece avviene solitamente supportato dai linguaggi di programmazione...

    questo significa che puoi tranquillamente eseguire l'operazione senza passare per una variabile di swap tipica dei linguaggi di programmazione, e scriverai, trivialmente

    SET NOCOUNT ON;
    USE tempdb;
    GO
    CREATE TABLE dbo.t (
    	Id int NOT NULL,
    	CodiceDisplay varchar(12),
    	CodiceBox varchar(12),
    	CodicePallet  varchar(12)
    	);
    GO
    INSERT INTO dbo.t
    	VALUES ( 1, 'TD0000000001', 'TB0000000001', 'TP0000000001'); --OK
    INSERT INTO dbo.t
    	VALUES ( 2, 'TD0000000002', 'TP0000000002', 'TB0000000002'); --NO
    INSERT INTO dbo.t
    	VALUES ( 3, 'TD0000000003', 'TB0000000003', 'TP0000000003'); --OK
    INSERT INTO dbo.t
    	VALUES ( 4, 'TD0000000004', 'TP0000000004', 'TB0000000004'); --NO
    GO
    SELECT *
    	FROM dbo.t;
    GO
    UPDATE dbo.t
    	SET CodiceBox = CodicePallet
    		, CodicePallet = CodiceBox
    	WHERE LEFT(CodiceBox, 2) = 'TP' AND LEFT(CodicePallet, 2) = 'TB';
    GO
    SELECT *
    	FROM dbo.t;
    GO
    DROP TABLE dbo.t;
    --<-------------
    Id          CodiceDisplay CodiceBox    CodicePallet
    ----------- ------------- ------------ ------------
    1           TD0000000001  TB0000000001 TP0000000001
    2           TD0000000002  TP0000000002 TB0000000002
    3           TD0000000003  TB0000000003 TP0000000003
    4           TD0000000004  TP0000000004 TB0000000004
    
    Id          CodiceDisplay CodiceBox    CodicePallet
    ----------- ------------- ------------ ------------
    1           TD0000000001  TB0000000001 TP0000000001
    2           TD0000000002  TB0000000002 TP0000000002
    3           TD0000000003  TB0000000003 TP0000000003
    4           TD0000000004  TB0000000004 TP0000000004

    dove l'assegnazione prevede di caricare la colonna CodiceBox con il valore di CodicePallet e viceversa...

    saluti "atomici"


    http://www.hotelsole.com/asql/index.php - DbaMgr2k - DbaMgr and further SQL Tools http://www.hotelsole.com/

    venerdì 3 gennaio 2014 18:05
    Moderatore
  • Non credevo fosse cosi complicato, il metodo che mi suggerisci non credo sia quello giusto per fare una queery di update di parte dei caratteri del record.

    update [codicedisplay] = '2649D999999'

    where [CodiceDisplay]='2649D0999999'

    devo fare una queery che mi toglie lo zero in 100 records

    il were lo so impostare (whre [nomenumerolavorazione]='nomenumerolavorazione' and [numeroprogressivo] between '120' and '220')

    quello che mi interessa sapere è il codice da mettere nell'update per far si che venga sostituito solo parte del record

    venerdì 7 febbraio 2014 11:02
  • Non credevo fosse cosi complicato, il metodo che mi suggerisci non credo sia quello giusto per fare una queery di update di parte dei caratteri del record.

    update [codicedisplay] = '2649D999999'

    where [CodiceDisplay]='2649D0999999'

    devo fare una queery che mi toglie lo zero in 100 records

    il were lo so impostare (whre [nomenumerolavorazione]='nomenumerolavorazione' and [numeroprogressivo] between '120' and '220')

    quello che mi interessa sapere è il codice da mettere nell'update per far si che venga sostituito solo parte del record

    dimenticavo di dire che nei 100 record che devo togliere lo zero davanti al numero finale che cambia,

    ciè si presenta cosi

    2649D0999999.....2649D0999998.....2649D0999997.....2649D09999996.....2649D09999995

    e io devo updatearli in:

    2649D999999.....2649D999998.....2649D999997.....2649D9999996.....2649D9999995

    venerdì 7 febbraio 2014 11:12
  • ho risolto il problema utilizzando l'operatore replace

    nel mio caso ho fatto così:

    Set [CodiceDisplay] = replace(codicedisplay, '2649DP0', '2649DP')

    WHERE [NomeNumeroLavorazione]='xxxxxx' and [NumeroProgressivo] between '544927' and '545084'

    venerdì 7 febbraio 2014 11:44