none
[T-SQL ] copiare record esistenti in nella stessa tabella RRS feed

  • Domanda

  • Buongiorno a tutti, il mio problema che non riesco a capire...forse è una sciocchezza ma mi sto incartando è questo:

    ho una tabella di questo tipo relazionata da una che gli da il valore di riferimento:

    CREATE TABLE [dbo].[Table_Spese] (
        [Id]              INT            IDENTITY (1, 1) NOT NULL,
        [ImportoPresunto] DECIMAL (8, 2) NULL,
        [Descrizione]     NVARCHAR (500) NULL,
        [ImportoEvaso]    DECIMAL (8, 2) NULL,
        [DataScadenza]    DATE           NULL,
        [c1]              NVARCHAR (50)  NULL,
        [c2]              NVARCHAR (50)  NULL,
        PRIMARY KEY CLUSTERED ([Id] ASC)
    );

    le due tabelle sono relazionate dal campo c1, avrei la necessità che quando creo un nuovo record nella tabella "Table_AnnoMese" e quindi creo un nuovo record nella "Table_Spese" una query dovrebbe controllare se ci sono record con "ImportoPresunto">0 e copiare questi del record della precedente relazione  nel nuovo record della nuova relazione.

    Table_AnnoMese Id=1,.....Tutti i campi

                                    -->Relazione C1=Gennaio2020 (1 a molti) --> Table_Spese Id=1....Tutti i campi..

                                                                                                   --> Table_Spese Id=2....Tutti i campi..

                                                                                                   --> Table_Spese Id=3....Tutti i campi..

    Table_AnnoMese Id=2,.....Tutti i campi

                                      -->Relazione C1=Febbraio2020 (1 a molti) --> Table_Spese Id=1....Tutti i campi..

    Nella creazione del record "Id=2,.....Tutti i campi -->Relazione C1=Febbraio2020 (1 a molti) --> Table_Spese Id=1....Tutti i campi.." dovrebbe controllare i record precedenti di "Gennaio2020" e verificare se nel campo "importo presunto" vi sono valori > di 0 e generare tanti record quanti ne trova in "table_Spese relazionata" a "Febbraio2020"

    C'è un modo?

    Grazie

    Guido


    • Modificato Guido.G giovedì 7 maggio 2020 09:59
    giovedì 7 maggio 2020 09:57

Risposte

  • Ho provato a cercare di creare una tabella temporanea per immettere i dati e rileggerli successivamente, ma dopo molti scontri....considerando che sono autodidatta con molte lacune, ho optato per una tabella fisica nel database da usare come temporanea.

    Quindi copiando la tabella da utilizzare e rinominandola come Temp:

    CREATE TABLE [dbo].[Table_Temp] (
        [Id]              INT            IDENTITY (1, 1) NOT NULL,
        [ImportoPresunto] DECIMAL (8, 2) NULL,
        [Descrizione]     NVARCHAR (500) NULL,
        [ImportoEvaso]    DECIMAL (8, 2) NULL,
        [DataScadenza]    DATE           NULL,
        [c1]              NVARCHAR (50)  NULL,
        [c2]              NVARCHAR (50)  NULL,
        PRIMARY KEY CLUSTERED ([Id] ASC)
    );
    

    ho creato alcune query per la gestione dei trasferimenti dei dati dalla tabella spese verso la tabella temp e viceversa, con aggiornamento di un campo per il mio funzionamento.

    INSERT INTO Table_Temp (ImportoPresunto, Descrizione, ImportoEvaso, DataScadenza,c1, c2 )
    SELECT ImportoPresunto, Descrizione, ImportoEvaso, DataScadenza, c1, c2
    FROM Table_Spese 
    WHERE (c1=@AnnoMese AND ImportoPresunto>0 )
    

    con questa query trasferisco i dati nella tabella temp condizionati dai parametri WHERE.

    INSERT INTO Table_Spese(ImportoPresunto, Descrizione, ImportoEvaso, DataScadenza, c1, c2 )
    SELECT ImportoPresunto, Descrizione, ImportoEvaso, DataScadenza, c1, c2
    FROM Table_Temp
    WHERE c1=@annomesecorrente

    con questa query trasferisco i dati dalla tabella temp alla tabella spese che creo nuova condizionata dai parametri WHERE.

    Per le mie necessità poi ho utilizzato la query qui sotto per aggiornare un campo:

    UPDATE Table_Temp
    SET c1=@meseannoattuale

    e con la query di seguito elimino tutti i dati dalla tabella temp:

    DELETE FROM [dbo].[Table_Temp]
    in questo modo ho risolto...forse c'è un modo più semplice e veloce...

    • Contrassegnato come risposta Guido.G venerdì 8 maggio 2020 10:56
    venerdì 8 maggio 2020 10:56