Copia dati da tabella ad un'altra in automatico

martedì 18 settembre 2007 - 08.46

Anser Profilo | Junior Member

Ciao a tutti.
utilizzo SQL Server 2000.

Ho una tabella "A" con i seguenti campi (DataOra, Pippo, Pluto, Tizio, Caio, Sempronio).
I dati vengono inseriti in tabella ogni minuto.

Ho creato una tabella "B" con i campi DataOra e Caio.

Vorrei che in automatico (ogni volta che si aggiorna la tabella "A") venisse copiato sulla tabella "B" l'ultimo dato inserito, ma solo i campi DataOra e Caio.
Vorrei che venisse fatto in automatico dal Database SQL stesso senza usare del codice.
Ho sentito parlare di trigger e stored procedure. Quale devo usare fra queste 2?

Potreste postarmi un esempio?

Grazie Mille in anticipo

Anser

lbenaglia Profilo | Guru

>Ho sentito parlare di trigger e stored procedure. Quale devo
>usare fra queste 2?

Ciao Anser,

in questo caso un trigger di INSERT fa esattamente quello di cui hai bisogno.

>Potreste postarmi un esempio?
Con tizio, caio e sempronio no.
Se vuoi un esempio posta i comandi DDL delle due tabelle (CREATE TABLE).

>Grazie Mille in anticipo
Prego.

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

alx_81 Profilo | Guru

>Ciao a tutti.
Ciao!

>utilizzo SQL Server 2000.
>
>Ho una tabella "A" con i seguenti campi (DataOra, Pippo, Pluto,
>Tizio, Caio, Sempronio).
>I dati vengono inseriti in tabella ogni minuto.
>
>Ho creato una tabella "B" con i campi DataOra e Caio.
>
>Vorrei che in automatico (ogni volta che si aggiorna la tabella
>"A") venisse copiato sulla tabella "B" l'ultimo dato inserito,
>ma solo i campi DataOra e Caio.
>Vorrei che venisse fatto in automatico dal Database SQL stesso
>senza usare del codice.
>Ho sentito parlare di trigger e stored procedure. Quale devo
>usare fra queste 2?
Personalmente non stimo i trigger e tendo ad utilizzarli il meno possibile per alcuni di motivi
1) Sono pressochè invisibili, nel senso che non saltano all'occhio a meno che non si controllino per bene le caratteristiche delle tabelle.
2) A volte sono pericolosi poichè potrebbero coinvolgere altri oggetti, creando conflitti irrisolvibili (se male utilizzati, ovviamente)
3) Non sono sempre chiari a livello di documentazione del progetto

Preferisco la soluzione stored procedure, poichè di solito mi offre maggiore controllo e modularità anche nel contesto di sicurezza del database.
Quindi, in definitiva, mi sento di consigliarti l'utilizzo delle stored procedure.

>Potreste postarmi un esempio?
sono "sottoprogrammi" più o meno articolati, che sfruttano il linguaggio T-SQL per attuare anche logiche di business.

proviamo a vedere il tuo esempio:

USE tempdb; GO -- creo le tabelle ---------------------------------------------------------------------- CREATE TABLE #tabellaA ( ID int IDENTITY(1,1) Primary Key CLUSTERED, DataOra smalldatetime NOT NULL, Pippo tinyint NOT NULL, Pluto char(1) NOT NULL, Tizio int NOT NULL, Caio int NOT NULL, Sempronio int NOT NULL ) GO CREATE TABLE #tabellaB ( ID int IDENTITY(1,1) Primary Key CLUSTERED, DataOra smalldatetime NOT NULL, Caio int NOT NULL ) GO ---------------------------------------------------------------------- -- creo la stored procedure ---------------------------------------------------------------------- CREATE PROCEDURE CopiaRecordInTabellaB @DataOra smalldatetime, @Pippo tinyint, @Pluto char(1), @Tizio int, @Caio int, @Sempronio int AS BEGIN -- disattivo i messaggi SET NOCOUNT ON; -- apro la transazione per mantenere atomica l'operazione. -- nel caso in cui si verifichi un errore al suo interno, annullo tutto con rollback. BEGIN TRAN INSERT #tabellaA SELECT @DataOra, @Pippo, @Pluto, @Tizio, @Caio, @Sempronio -- inserisco anche su tabellaB INSERT #tabellaB SELECT @DataOra, @Caio COMMIT TRAN END ---------------------------------------------------------------------- GO -- la eseguo ---------------------------------------------------------------------- DECLARE @DataCorrente smalldatetime SET @DataCorrente = GETDATE() EXEC CopiaRecordInTabellaB @DataCorrente, 1, 'A', 1, 1, 1 EXEC CopiaRecordInTabellaB @DataCorrente, 2, 'B', 2, 2, 2 EXEC CopiaRecordInTabellaB @DataCorrente, 3, 'C', 3, 3, 3 EXEC CopiaRecordInTabellaB @DataCorrente, 4, 'D', 4, 4, 4 EXEC CopiaRecordInTabellaB @DataCorrente, 5, 'E', 5, 5, 5 GO ---------------------------------------------------------------------- -- ricavo i record inseriti ---------------------------------------------------------------------- SELECT * FROM #tabellaA SELECT * FROM #tabellaB ---------------------------------------------------------------------- -- faccio pulizia ---------------------------------------------------------------------- DROP TABLE #tabellaA DROP TABLE #tabellaB DROP PROCEDURE CopiaRecordInTabellaB ----------------------------------------------------------------------


>
>Grazie Mille in anticipo
di nulla!

Alx81 =)

http://blogs.dotnethell.it/suxstellino

Anser Profilo | Junior Member

scusa lBenaglia ma non sono molto pratico.
Queste tabelle non le ho create da codice ma manualmente da Enterprise Manager inserendo su "Design" i nomi delle variabili. Se mi dici dove posso trovare questo codice coi comandi DDL te lo posto..

grazie ancora

Anser

lbenaglia Profilo | Guru

>Queste tabelle non le ho create da codice ma manualmente da Enterprise
>Manager inserendo su "Design" i nomi delle variabili. Se mi dici
>dove posso trovare questo codice coi comandi DDL te lo posto..

In Enterprise Manager seleziona il database, tasto DX, All Tasks, Generate SQL Scripts...
Seleziona le tabelle, eventuali constraints e salvati in un file i comandi DDL.
Apri il file ed esegui il copia&incolla del contenuto in un post di risposta.

>grazie ancora
Prego.

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

Anser Profilo | Junior Member

Ecco le tabelle:

/* TABELLA ORIGINE */
CREATE TABLE [dbo].[PaperFloat] (
[DateAndTime] [datetime] NULL ,
[Millitm] [smallint] NULL ,
[TagIndex] [smallint] NULL ,
[Val] [float] NULL ,
[Status] [varchar] (1) COLLATE Latin1_General_CI_AS NULL ,
[Marker] [varchar] (1) COLLATE Latin1_General_CI_AS NULL
) ON [PRIMARY]
GO

/* TABELLA DESTINAZIONE */
CREATE TABLE [dbo].[Paper] (
[DateTime] [datetime] NULL ,
[ValA] [float] NULL
[ValB] [float] NULL
) ON [PRIMARY]
GO


Ho notato una cosa e ora provo a spiegarti l'aggiunta di "ValB" nella tabella di destinazione (nella prima mia domanda ti chiedevo di copiare solo un campo)

La tabella di origine "PaperFloat" viene popolata da un PLC.
Ho notato che vengono scritti 2 campi nello stesso minuto:
es.
DateandTime, Millitm, Tagindex,Val, Status, Marker
17-09-2007 11.35, 0, 0, 135, 0, 0
17-09-2007 11.35, 0, 1, 147, 0, 0
17-09-2007 11.36, 0, 0, 139, 0, 0
17-09-2007 11.36, 0, 1, 151, 0, 0

a questo punto mi interesserebbe sulla tabella finale:

DateTime, ValA, ValB
17-09-2007 11.35, 135, 147
17-09-2007 11.36, 139, 151

Spero di essermi spiegato bene..
Ti ringrazio ancora per la pazienza





Anser

lbenaglia Profilo | Guru

>Ho notato una cosa e ora provo a spiegarti l'aggiunta di "ValB"
>nella tabella di destinazione (nella prima mia domanda ti chiedevo
>di copiare solo un campo)
>
>La tabella di origine "PaperFloat" viene popolata da un PLC.
>Ho notato che vengono scritti 2 campi nello stesso minuto:
>es.
>DateandTime, Millitm, Tagindex,Val, Status, Marker
>17-09-2007 11.35, 0, 0, 135, 0, 0
>17-09-2007 11.35, 0, 1, 147, 0, 0
>17-09-2007 11.36, 0, 0, 139, 0, 0
>17-09-2007 11.36, 0, 1, 151, 0, 0
>
>a questo punto mi interesserebbe sulla tabella finale:
>
>DateTime, ValA, ValB
>17-09-2007 11.35, 135, 147
>17-09-2007 11.36, 139, 151

Ti allego un esempio:

USE tempdb; CREATE TABLE dbo.PaperFloat ( DateAndTime datetime NOT NULL, Millitm smallint NOT NULL, TagIndex smallint NOT NULL, Val float NOT NULL, [Status] tinyint NOT NULL, Marker tinyint NOT NULL ); CREATE TABLE dbo.Paper ( DateAndTime datetime NOT NULL, TagIndex smallint NOT NULL, Val float NOT NULL ); GO CREATE TRIGGER dbo.trI_PaperFloat ON dbo.PaperFloat FOR INSERT AS INSERT dbo.Paper SELECT DateAndTime, TagIndex, Val FROM INSERTED; GO INSERT dbo.PaperFloat VALUES('20070917 11:35', 0, 0, 135, 0, 0); INSERT dbo.PaperFloat VALUES('20070917 11:35', 0, 1, 147, 0, 0); INSERT dbo.PaperFloat VALUES('20070917 11:36', 0, 0, 139, 0, 0); INSERT dbo.PaperFloat VALUES('20070917 11:36', 0, 1, 151, 0, 0); /* Vediamo se il trigger è scattato */ SELECT * FROM dbo.Paper; GO /* Output: DateAndTime TagIndex Val ----------------------- -------- ---------------------- 2007-09-17 11:35:00.000 0 135 2007-09-17 11:35:00.000 1 147 2007-09-17 11:36:00.000 0 139 2007-09-17 11:36:00.000 1 151 (4 row(s) affected) */ /* OK, ora definiamo una vista che restituisce i valori richiesti */ CREATE VIEW dbo.vwPaper(DateAndTime, ValA, ValB) AS SELECT DateAndTime , MAX(CASE TagIndex WHEN 0 THEN Val ELSE 0 END) , MAX(CASE TagIndex WHEN 1 THEN Val ELSE 0 END) FROM dbo.Paper GROUP BY DateAndTime; GO /* Query */ SELECT * FROM dbo.vwPaper; /* Output: DateAndTime ValA ValB ----------------------- ---------------------- ---------------------- 2007-09-17 11:35:00.000 135 147 2007-09-17 11:36:00.000 139 151 (2 row(s) affected) */ DROP VIEW dbo.vwPaper; DROP TABLE dbo.PaperFloat, dbo.Paper;

>Ti ringrazio ancora per la pazienza
Prego.

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

Anser Profilo | Junior Member

Sei stato gentilissimo, Grazie Mille davvero!!!

Anser
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5