Clonare un record su stessa tabella

di il
1 risposte

Clonare un record su stessa tabella

Buongiorno a tutti,
Ho una tabella (SQL Server), nella quale, una volra seleziono un record (tramite lettura di un barcode), lo devo clonare.
La mia domanda è:
lo posso clonare forzando il valore del campo BarCode del muovo record a NULL ?
Clonando tutto il contenuto, mi ritroverei 2 record identici, mentre a me, dopo la clonazione serve "accedere" al record nuovo per modificare alcuni campi.
Grazie 1000 a chi mi potrà dare un aiuto

Daniele G

1 Risposte

  • Re: Clonare un record su stessa tabella

    Salve,
    a mio parere la domanda e' sia ambigua che non completa...
    al di la' di cio', ovviamente avendo un'entita' definita ad esempio come
    oggetto {[Id] tipo_dato (PK) | [Attributo1] tipo_dato | [Attributo2] tipo_dato | [Attributo3] tipo_dato | [barcode] char(13) NULL }
    possiamo sicuramente da un'entita' esistente forzare la generazione di una nuova riga/entita', passando tutti gli attributi dell'entita' gia' esistente, forzando NULL per l'attributo [barcode] (ovviamente questo nel DDL deve essere impostato in tal senso), MA forzando una nuova PK, sia esso ad esempio un valore intero (magari quindi ottenendola con identity), o uno uniqueidentifier (magari quindi utilizzando NEWID()), quindi utilizzando questa valorizzazione per ottenere una nuova riga...

    dopo l'inserimento della nuova riga, SQL Server e' in grado ad esempio di dirti il valore dell'ultimo identity generato con SCOPE_IDENTITY() [ https://docs.microsoft.com/it-it/sql/t-sql/functions/scope-identity-transact-sql?view=sql-server-ver15 ], mentre per NEWID(), nel caso lo generi tu al momento dell'insert non hai problema di riottenerlo in quanto l'lhai generato tu, similarmente a
    
    DECLARE @newId uniquidentifier = NEWID();
    INSERT INTO .... ( [Id], ...., [barcode] )
        VALUES ( @newId, ....., NULL );
    
    mentre nel caso tu abbia definito un default constraint per "autopopolare" la colonna tipo ad esempio
    
    CREATE .... (
    	[Id] uniqueidentifier DEFAULT NEWID(),
    	[Attributo1] int NOT NULL
    	);
    
    potrai recuperare il valore generato automaticamente dalla chiamata del default utilizzando la clausola OUTPUT... la cosa e' un po' piu' arzigogolata ma tendenzialmente semplice:
    
    DECLARE @lastId uniqueidentifier = NULL;
    DECLARE @op TABLE (
        ColGuid uniqueidentifier
    	);
    
    INSERT INTO [dbo].[testTB] ( [Attributo1] )    
    	OUTPUT inserted.[Id]
    		INTO @op
    	VALUES ( 1 );
    
    SELECT @lastId = o.[ColGuid] 
    	FROM @op o;
    
    SELECT t.[Id], t.[Attributo1], @lastId AS [Id Recuperata e ritornabile al chiamante]
    	FROM [dbo].[testTB] t;
    
    il valore di @lastId e' quindi ritornabile al chiamante per referenziare la riga "clonata" in questo senso...

    questo con chiavi primarie surrogate e generabili automaticamente dal sistema, mentre se utilizzi altro "tipo" di chiavi primarie, va analizzato come queste siano composte...

    saluti omnia
    --
    Andrea
Devi accedere o registrarti per scrivere nel forum
1 risposte