DTS sqlserver

martedì 12 luglio 2005 - 13.29

nandonando Profilo | Senior Member

Questa è la mia query
INSERT INTO tblVerifiche (ID_Ispettore, ID_Impianto, ID_TipoVerifiche, dataultimaverifica) SELECT ID_Ispettore, ID_Impianto, ID_TipoVerifiche,dataverifica FROM tblVerifiche WHERE (ID = 1)

al posto di id_ispettore metterlo uguale al predente è possibile metterlo uguale ad esempio al valore 2?
e poi posso contemporaneamente aggiornare il record che stò duplicando?
grazie

lbenaglia Profilo | Guru

>Questa è la mia query
>INSERT INTO tblVerifiche (ID_Ispettore, ID_Impianto, ID_TipoVerifiche,
>dataultimaverifica) SELECT ID_Ispettore, ID_Impianto, ID_TipoVerifiche,dataverifica
>FROM tblVerifiche WHERE (ID = 1)
>
>al posto di id_ispettore metterlo uguale al predente è possibile
>metterlo uguale ad esempio al valore 2?

Ciao nandonando,

purtroppo anche in questo caso non ti seguo.
Ti invito a postare un esempio con la struttura della tabella (CREATE TABLE...) completa di constraints, alcune righe di prova (INSERT INTO...) ed il risultato che vorresti ottenere.

Ciao!

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

nandonando Profilo | Senior Member

Dove trovo quello che tu mi chiedi?
scusa

lbenaglia Profilo | Guru

>Dove trovo quello che tu mi chiedi?

Come dove lo trovi?!
Ti ho chiesto di preparare un esempio in modo da capire meglio quello che stai cercando di fare.
Per generare lo script della tabella, selezionala da Enterprise Manager, tasto DX, All Tasks, generate SQL Script..., avendo cura di selezionare nel tab Options la check box "Script PRIMARY keys, FOREIGN keys, defaults, and check constraints".
Prepara dei comandi INSERT INTO per inserire delle righe di prova e riporta nel dettaglio quale risultato vuoi ottenere.

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

nandonando Profilo | Senior Member

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tblVerifiche]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tblVerifiche]
GO

CREATE TABLE [dbo].[tblVerifiche] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[ID_TipoVerifiche] [int] NOT NULL ,
[ID_Impianto] [int] NOT NULL ,
[ID_Ispettore] [int] NOT NULL ,
[ID_Contratto] [int] NULL ,
[ID_Vecchio_Ispettore] [int] NULL ,
[DataVerifica] [datetime] NULL ,
[PROGRAMMATA] [bit] NULL ,
[NumDoc] [int] NULL ,
[Esito] [int] NULL ,
[ImportoIspettore] [decimal](10, 0) NULL ,
[PagatoIspettore] [int] NULL ,
[Fatturata] [int] NULL ,
[ImportoIncassato] [decimal](19, 4) NULL ,
[Data_Asseg_Ispettore] [datetime] NULL ,
[PrescrizioniPrec] [int] NULL ,
[AnnotazioneVer] [int] NULL ,
[Funi] [nvarchar] (100) COLLATE Latin1_General_CI_AS NULL ,
[Blocchi] [nvarchar] (100) COLLATE Latin1_General_CI_AS NULL ,
[ExtraCorsa] [nvarchar] (100) COLLATE Latin1_General_CI_AS NULL ,
[Paracadute] [nvarchar] (100) COLLATE Latin1_General_CI_AS NULL ,
[Limitatore] [nvarchar] (100) COLLATE Latin1_General_CI_AS NULL ,
[Difese] [nvarchar] (100) COLLATE Latin1_General_CI_AS NULL ,
[Isolamento] [nvarchar] (100) COLLATE Latin1_General_CI_AS NULL ,
[Manovra] [nvarchar] (100) COLLATE Latin1_General_CI_AS NULL ,
[Allarme] [nvarchar] (100) COLLATE Latin1_General_CI_AS NULL ,
[Valvola_sovrappressione] [nvarchar] (100) COLLATE Latin1_General_CI_AS NULL ,
[Valvola_blocco] [nvarchar] (100) COLLATE Latin1_General_CI_AS NULL ,
[Ripescaggio] [nvarchar] (100) COLLATE Latin1_General_CI_AS NULL ,
[Tubazioni] [nvarchar] (100) COLLATE Latin1_General_CI_AS NULL ,
[Targhe] [nvarchar] (100) COLLATE Latin1_General_CI_AS NULL ,
[Funzionamento] [nvarchar] (100) COLLATE Latin1_General_CI_AS NULL ,
[Terra] [nvarchar] (100) COLLATE Latin1_General_CI_AS NULL ,
[C17] [nvarchar] (100) COLLATE Latin1_General_CI_AS NULL ,
[C18] [nvarchar] (100) COLLATE Latin1_General_CI_AS NULL ,
[Prescrizioni] [ntext] COLLATE Latin1_General_CI_AS NULL ,
[Data_Pagamento_Ispettore] [datetime] NULL ,
[dataultimaverifica] [datetime] NULL ,
[ImportoIspettore_Euro] [decimal](19, 4) NULL ,
[ImportoIncassato_Euro] [decimal](19, 4) NULL ,
[DataCrtificato] [datetime] NULL ,
[DataCollaudo] [datetime] NULL ,
[Imponibile_Fattura] [decimal](18, 0) NULL ,
[Scadenza_periodica] [bit] NULL ,
[Perc_ispettore] [int] NULL ,
[Correzioni_note] [bit] NULL ,
[Note] [ntext] COLLATE Latin1_General_CI_AS NULL ,
[Mantenere_in_servizio] [bit] NULL ,
[Confermata] [bit] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

io volevo duplicare una riga soltanto con alcuni parametri di essa con questa in sertt:
INSERT INTO tblVerifiche (ID_Ispettore, ID_Impianto, ID_TipoVerifiche,
>dataultimaverifica) SELECT ID_Ispettore, ID_Impianto, ID_TipoVerifiche,dataverifica
>FROM tblVerifiche WHERE (ID = 1)

e ti chiedevo se per caso avessi voluto inserire uno dei valori in modo normale con la stessa query(ad esempio id_tipoverifiche=2) come avrei dovuto fare?
grazie e scusami

lbenaglia Profilo | Guru

Perdonami, ma ti sembra di aver riportato quello che ti ho chiesto?

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

nandonando Profilo | Senior Member

Nel frattempo ho trovato quello che ti chiedevo scusa la mia ignoranza questo era quello che ti chiedevo:
INSERT INTO tblVerifiche (ID_Ispettore, ID_Impianto, ID_TipoVerifiche, dataultimaverifica) SELECT '2', ID_Impianto, ID_TipoVerifiche,dataverifica FROM tblVerifiche WHERE (ID = 1)

cioè inserire id_ispettore(in questo caso) non dalla query della select :
------
Grazie mille e se posso ti faccio un'altra domanda
è possibile nella stessa query aggiornare il record duplicato in partenza?
ti spiego il motivo:
una volta duplicato il record io devo cambiare lo stato a quello originale e secondo me è sconsigliabile farlo con due select divise (una per l'insert e un'altra per l'update):
potrebbe accadere che si aggiorni un record ma non faccia l'insert e viceversa quindi è possibile fare tutto insieme?
grazie e scusa ancora


lbenaglia Profilo | Guru

>Nel frattempo ho trovato quello che ti chiedevo scusa la mia
>ignoranza questo era quello che ti chiedevo:
>INSERT INTO tblVerifiche (ID_Ispettore, ID_Impianto, ID_TipoVerifiche,
>dataultimaverifica) SELECT '2', ID_Impianto, ID_TipoVerifiche,dataverifica
>FROM tblVerifiche WHERE (ID = 1)

Non lo avevo capito, è per questo che ti chiedevo un esempio ma a quanto pare non ci siamo intesi.
La prossima volta cerca di fornirci un esempio COMPLETO con le strutture delle tabelle (eventualmente semplificate con poche colonne, non come la CREATE TABLE che hai postato!!!), alcune righe di prova (non l'hai fatto) ed il risultato sottoforma di righe che vorresti ottenere.

>è possibile nella stessa query aggiornare il record duplicato
>in partenza?

No, una query di INSERT non può contemporaneamente inserire ed aggiornare una riga (se ho capito bene la tua domanda).

>ti spiego il motivo:
>una volta duplicato il record io devo cambiare lo stato a quello
>originale e secondo me è sconsigliabile farlo con due select
>divise (una per l'insert e un'altra per l'update):

Puoi aprire una transazione esplicita che racchiuda in un'unica operazione logica le due operazioni fisiche di INSERT e di UPDATE:

SET XACT_ABORT ON
BEGIN TRAN

INSERT...
UPDATE...

COMMIT TRAN

Per ulteriori informazioni leggi i seguenti paragrafi dei Books Online:

"Transactions"
http://msdn.microsoft.com/library/en-us/acdata/ac_8_md_06_2it2.asp

"BEGIN TRANSACTION"
http://msdn.microsoft.com/library/en-us/tsqlref/ts_ba-bz_96zy.asp

"COMMIT TRANSACTION"
http://msdn.microsoft.com/library/en-us/tsqlref/ts_ca-co_7w6m.asp

"ROLLBACK TRANSACTION"
http://msdn.microsoft.com/library/en-us/tsqlref/ts_ra-rz_471q.asp

"SET XACT_ABORT"
http://msdn.microsoft.com/library/en-us/tsqlref/ts_set-set_0rqs.asp

>potrebbe accadere che si aggiorni un record ma non faccia l'insert
>e viceversa quindi è possibile fare tutto insieme?

Che significa questa frase?

>grazie e scusa ancora

Ciao,

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

nandonando Profilo | Senior Member

Mi potresti fare un banale esempio ?
fai contto che questa è la mia insert

INSERT INTO tblVerifiche (ID_Impianto) SELECT ID_Impianto, FROM tblVerifiche WHERE (ID = 1)

e l'update è
UPDATE tblVerifiche
SET PROGRAMMATA = 0
WHERE (ID = 1) come l'id precedente ovvio





lbenaglia Profilo | Guru

>Mi potresti fare un banale esempio ?
Prima leggi i documenti che ti ho indicato, fai dei test ragionando con la tua testa e solo in caso di problemi posta una domanda specifica.

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

nandonando Profilo | Senior Member

BEGIN TRAN T1 UPDATE tblVerifiche
SET PROGRAMMATA = 0
WHERE (ID = 21003) BEGIN TRAN M2
INSERT
INTO tblVerifiche(ID_Ispettore, ID_Impianto, ID_TipoVerifiche, dataultimaverifica)
SELECT '1', ID_Impianto, ID_TipoVerifiche, dataverifica
FROM tblVerifiche
WHERE (ID = 21003) COMMIT TRAN M2 COMMIT TRAN T1

Dove sbalio?

lbenaglia Profilo | Guru

>BEGIN TRAN T1 UPDATE tblVerifiche
> SET PROGRAMMATA
>= 0
> WHERE (ID = 21003) BEGIN
>TRAN M2
>
> INSERT
>
> INTO tblVerifiche(ID_Ispettore, ID_Impianto, ID_TipoVerifiche,
>dataultimaverifica)
>
> SELECT '1', ID_Impianto, ID_TipoVerifiche,
>dataverifica
>
> FROM tblVerifiche
>
> WHERE (ID = 21003) COMMIT TRAN
>M2 COMMIT TRAN T1
>
>Dove sbalio?

Che cosa ti avevo suggerito 3 threads più sotto?

"Puoi aprire una transazione esplicita che racchiuda in un'unica operazione logica le due operazioni fisiche di INSERT e di UPDATE:

SET XACT_ABORT ON
BEGIN TRAN

INSERT...
UPDATE...

COMMIT TRAN"

Quindi:

SET XACT_ABORT ON

BEGIN TRAN

UPDATE tblVerifiche
SET PROGRAMMATA = 0
WHERE ID = 21003

INSERT INTO tblVerifiche(ID_Ispettore, ID_Impianto, ID_TipoVerifiche, dataultimaverifica)
SELECT '1', ID_Impianto, ID_TipoVerifiche, dataverifica
FROM tblVerifiche
WHERE ID = 21003

COMMIT TRAN


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

nandonando Profilo | Senior Member

Funziona :

The query designer does not support the set statement sql construct

lbenaglia Profilo | Guru

> The query designer does not support the set statement sql construct

Usa il Query Analyzer.

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

nandonando Profilo | Senior Member

Ok ma è solo un discorso di visualizzazione solo che ho notato che se faccio un errore su una delle due query l'altra la esegue comunque
come dovrei fare ad evitare ciò?
questo era quello che cercavo di spiegarti
scusa ancora

lbenaglia Profilo | Guru

>Ok ma è solo un discorso di visualizzazione solo che ho notato
>che se faccio un errore su una delle due query l'altra la esegue
??

Se una delle query fallisce, verrà effettuato il rollback dell'intera transazione, quindi verranno ripristinati i valori di partenza mantenento l'integrità del database.

Dimmi la verità, hai letto i links che ti ho passato?

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

nandonando Profilo | Senior Member

Si,
SET XACT_ABORT ON

BEGIN TRAN

UPDATE tblVerifiche
SET PROGRAMMATA = 0
WHERE ID = 21003

INSERT INTO tblVerifiche(ID_Ispettore, ID_Impianto, ID_TipoVerifiche, dataultimaverifica)
SELECT '1', ID_Impianto, ID_TipoVerifiche, dataverifica
FROM tblVerifiche
WHERE ID = 21003

COMMIT TRAN

forse manca qualcosa ?

perchè non mifa il rollback
quindi non ripreistina lo stato iniziale

lbenaglia Profilo | Guru

>Si,
>SET XACT_ABORT ON
>
>BEGIN TRAN
>
>UPDATE tblVerifiche
>SET PROGRAMMATA = 0
>WHERE ID = 21003
>
>INSERT INTO tblVerifiche(ID_Ispettore, ID_Impianto, ID_TipoVerifiche,
>dataultimaverifica)
>SELECT '1', ID_Impianto, ID_TipoVerifiche, dataverifica
>FROM tblVerifiche
>WHERE ID = 21003
>
>COMMIT TRAN
>
>forse manca qualcosa ?

No c'è tutto.
Che cosa ti fa dire che non va bene? Ricevi qualche errore nell'esecuzione della query da Query Analyzer? Cerca di fornirci TUTTE le informazioni in tuo possesso.

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

nandonando Profilo | Senior Member

(0 row(s) affected)


(1 row(s) affected)

ed infatti

infatti non esegue laprima istruzione ma esegue la seconda


lbenaglia Profilo | Guru

>(0 row(s) affected)
>
>
>(1 row(s) affected)
>
>ed infatti
>
>infatti non esegue laprima istruzione ma esegue la seconda

Quindi? Non c'è nessuna eccezione, pertanto l'esecuzione della transazione avviene con successo.

Ora, prova a rispiegare dal principio cosa vuoi fare...

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

nandonando Profilo | Senior Member

>SCusa il ritardo,
intendo se per qualche motivo la mia opagina va in errore o qualsiasi altro problema le istruzioni le esgue entrambe o noi?
scusa ancora

lbenaglia Profilo | Guru

>intendo se per qualche motivo la mia opagina va in errore o qualsiasi
>altro problema le istruzioni le esgue entrambe o noi?

Se una delle due istruzioni SQL va in errore, allora l'intera transazione verrà annullata ripristinando i dati di partenza.
Se la pagina va in errore per altri motivi, ovviamente questo non c'entra niente con SQL Server, quindi se entrambe le istruzioni SQL sono andate a buon fine, la transazione verrà conclusa con successo.

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

nandonando Profilo | Senior Member

Ti spego io devo inserire aggiornare circa mille dati con un ciclo quindi per problemi di lentezza o rechè l'utente faccia qualcosa di strano insomma per qualsiasi problema far in modo che se c'è un problema non faccia nessuna delle due istruzioni ,
è possibile?

lbenaglia Profilo | Guru

>Ti spego io devo inserire aggiornare circa mille dati con un
>ciclo quindi per problemi di lentezza o rechè l'utente faccia
>qualcosa di strano insomma per qualsiasi problema far in modo
>che se c'è un problema non faccia nessuna delle due istruzioni
>,
>è possibile?

Se ho cpaito bene in caso di errore vuoi annullare tutte le operazioni SQL effettuate all'interno del loop, giusto?
Se la risposta è si, apri una transazione prima di entrare nel loop, esegui le operazioni del caso e all'uscita del ciclo chiudi la transazione.
Prima parlavi di pagina, il thread parla di DTS, la situazione è come sempre confusa, ma in ogni modo credo che tu stia operando con un linguaggio di scripting come VBScript. Dato che VBScript non prevede un error handler, dopo l'esecuzione dio ogni comando SQL verifica se si è verificato un errore interrogando la proprietà Number dell'oggetto Err e se risulta <> da 0, esegui il rollback della transazione ed esci dal loop.
Per maggiori info su come gestire le transazioni con ADO, leggi il seguente paragrafo di MSDN:

"BeginTrans, CommitTrans, and RollbackTrans Methods"
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmthbegintrans.asp

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

nandonando Profilo | Senior Member

Prima facevo cosi'
strInsert.CommandText = STRINGA
strInsert.Connection.Open()
Try

strInsert.ExecuteNonQuery()
strInsert.Connection.Close()
Catch ex As Exception

strInsert.Connection.Close()
End Try

ora dovrei fare una cosa del genere giusto?

strInsert.CommandText = STRINGA
strInsert.Connection.Open()

strInsert.Connection.BeginTransaction()
strInsert.ExecuteNonQuery()
If Err.Number = 0 Then
?????
Else
????
End If
strInsert.Connection.Close()

lbenaglia Profilo | Guru

Che linguaggio di programmazione stai utilizzando?
In che ambiante stai operando?
Quello spezzone di codice non riporta la dichiarazione delle variabili (vedo che fantomatiche variabili stringa (con prefisso str) hanno metodi e proprietà!!)

Ascolta, ti rendi conto di quanto sia difficile aiutarti se ad ogni post cambi le carte in tavola?
Mi parli di ASP, di DTS ma quel codice NON SI RIFERISCE nè ad ASP Classic nè ad un DTS di SQL Server 2000... ora, sinceramente non posso dedicare 2 giornate del mio lavoro a risolvere il tuo problema, quindi se le domande saranno specifiche risponderò volentieri, altrimenti questo sarà il mio ultimo intervento in questo thread.

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

nandonando Profilo | Senior Member

Scusami stò usando asp.net
il database è in sql server
il codice come dovrebbe essere
Dim cn As New SqlConnection(SqlConnString)
If cn.State = ConnectionState.Open Then
cn.Close()
End If
''''''''''''
Dim strInsert As New SqlCommand
strInsert.Connection = cn

Dim STRINGA As String

STRINGA = "INSERT INTO tblVerifiche (id_contratto,ID_Impianto, ID_TipoVerifiche, dataultimaverifica) SELECT id_contratto, ID_Impianto, ID_TipoVerifiche,dataverifica FROM tblVerifiche WHERE (ID = " & DataGridScadenzario.DataKeys(item.ItemIndex) & ")"

strInsert.CommandText = STRINGA
strInsert.Connection.Open()

strInsert.Connection.BeginTransaction()
strInsert.ExecuteNonQuery()
If Err.Number = 0 Then
??? cosa dovrei inserire
Else
??? cosa dovrei inserire
End If
strInsert.Connection.Close()




LudovicoVan Profilo | Junior Member

Proviamo a espugnare Gerusalemme.

> far in modo che se c'è un problema non faccia nessuna delle due istruzioni

Cosa intendi con "se c'è un problema"? Devi essere preciso.

Se intendi eccezioni dell'applicazione, a qualunque livello, l'approccio che ti ha mostrato lorenzo è la soluzione. Forse non ti è chiaro come realizzarlo da codice .NET. Ti consiglio l'esempio dell'MSDN che mostra proprio due comandi in una transazione: http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemdatasqlclientsqlconnectionclassbegintransactiontopic.asp

Per altro genere di problemi dovresti spiegare più in dettaglio cosa temi. Fra l'altro il tuo esempio è allarmante:
> (0 row(s) affected)
> (1 row(s) affected)
In questo caso NON c'è stato nessun errore! E' semplicemente la select che ha ritornato 0 righe, per cui non c'è stato inserimento... Se questo per te è un "problema", allora c'è un "problema di logica" di base, per cui dovresti decisamente spiegarti con più attenzione!

Ciao. -LV


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