Ciao Ciccio,
no, non esiste alcuna stored procedure che fa quello che chiedi.
Ad ogni modo esistono in commercio diversi tools studiati appositamente per
allineare i metadati.
Uno di questi è SQL Compare della red-gate software:
http://www.red-gate.com/SQL_Compare.htm
Andrea Benedetti, un utente di questo ng, ha scritto un tool analogo ma
gratuito di cui trovi maggiori info al seguente link:
http://www.absistemi.it/sqlCompare.aspx
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://mvp.support.microsoft.com
http://italy.mvps.org
"ciccio" <cic...@discussions.microsoft.com> wrote in message
news:459E0125-F71C-410B...@microsoft.com...
> ciao a tutti
> ho la necessità di confrontare le strutture di due tabelle e volevo sapere
> se esiste una stored procedure che restituisce questi dati.
>
> chi mi può aiutare?
Esistono software commerciali sviluppati ad hoc, come quello della Red Gate.
Esistono anche tool gratuiti come questo:
www.absistemi.it --> tools --> SQL CFront 2004
Tra le varie cose analizza e confronta strutture ed oggetti di due database
(tipicamente quello di sviluppo e quello di produzione).
Ogni feedback è sempre molto ben accetto.
> ciao
> Ciccio
HTH,
Andrea
Il programma mi piace, ma lo script sql che genera non tiene conto dei dati
presenti sul db del client, che con il DROP TABLE
Il programma mi piace, ma lo script sql che genera non tiene conto dei dati
presenti sul db del client, che con il DROP TABLE vanno persi;
come faccio a non perderli???
grazie
ciao Ciccio
Il programma si limita ad analizzare / confrontare tabelle ed oggetti e non
il loro contenuto.
Non puoi evitare la drop table e semplicemente allineare le strutture (alter
table, ecc...)?
> grazie
> ciao Ciccio
Prego,
Andrea
ok, ma nel caso dovessi fare un aggiornamento della struttura di un db coma
faccio??
ciao
Ciccio
"ciccio" <cic...@discussions.microsoft.com> wrote in message
news:E6C02C3E-63A4-4631...@microsoft.com...
Funzione compare
Imposti master e client (e testi la connessione)
Pulsante "Compare Tables Structures" --> "View Script sql"
Qui *dovresti* trovare le istruzioni da lanciare sul client per allineare le
sue tabelle alla struttura del master.
Pulsante "Compare Objects" --> per generare script di oggetti non presenti
sul db client
> ciao
> Ciccio
Ciao,
Andrea
http://www.davidemauri.it/dabcos
mi sarebbe piaciuto implementare anche un meccanismo di sincronizzazione (e
nei miei piani c'č ancora) ma per limiti di tempo non sono mai riuscito a
completarlo.
In ogni caso il confronto tra due db sulla struttura dei dati, viste e
stored procedure funziona benone.
Ciaoooo
--
Davide Mauri
www.davidemauri.it
"Andrea Benedetti" <abene...@absistemi.it> wrote in message
news:OzsviNg4...@tk2msftngp13.phx.gbl...
> Se ti interessa solo il confronto io ho in cantiere lo sviluppo di questo
> tool
Innanzitutto scusami se non ti ho risposto subito.
ho scaricato il file zip ed eseguito l'exe ma mi da il seguente errore:
-- an unhandled exception has occurred in your application.
La finestra di errore fornisce anche i seguenti 'dettagli':
< - - - - Inizio detail - - - - >
See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.
************** Exception Text **************
System.IO.FileNotFoundException: File or assembly name DaBCoS.Engine, or one
of its dependencies, was not found.
File name: "DaBCoS.Engine"
at DaBCoS.FormMain.FormMain_Load(Object sender, EventArgs e)
at System.Windows.Forms.Form.OnLoad(EventArgs e)
at System.Windows.Forms.Form.OnCreateControl()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.WmShowWindow(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.Form.WmShowWindow(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg,
IntPtr wparam, IntPtr lparam)
=== Pre-bind state information ===
LOG: DisplayName = DaBCoS.Engine, Version=1.0.1198.25769, Culture=neutral,
PublicKeyToken=null
(Fully-specified)
LOG: Appbase = C:\Documents and Settings\Sviluppo2\Desktop\dowload\
LOG: Initial PrivatePath = NULL
Calling assembly : DaBCoS, Version=0.2.1198.25769, Culture=neutral,
PublicKeyToken=null.
===
LOG: Policy not being applied to reference at this time (private, custom,
partial, or location-based assembly bind).
LOG: Post-policy reference: DaBCoS.Engine, Version=1.0.1198.25769,
Culture=neutral, PublicKeyToken=null
LOG: Attempting download of new URL file:///C:/Documents and
Settings/Sviluppo2/Desktop/dowload/DaBCoS.Engine.DLL.
LOG: Attempting download of new URL file:///C:/Documents and
Settings/Sviluppo2/Desktop/dowload/DaBCoS.Engine/DaBCoS.Engine.DLL.
LOG: Attempting download of new URL file:///C:/Documents and
Settings/Sviluppo2/Desktop/dowload/DaBCoS.Engine.EXE.
LOG: Attempting download of new URL file:///C:/Documents and
Settings/Sviluppo2/Desktop/dowload/DaBCoS.Engine/DaBCoS.Engine.EXE.
************** Loaded Assemblies **************
mscorlib
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.573
CodeBase:
file:///c:/windows/microsoft.net/framework/v1.1.4322/mscorlib.dll
----------------------------------------
DaBCoS
Assembly Version: 0.2.1198.25769
Win32 Version: 0.2.1198.25769
CodeBase:
file:///C:/Documents%20and%20Settings/Sviluppo2/Desktop/dowload/DaBCoS.exe
----------------------------------------
System.Windows.Forms
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.573
CodeBase:
file:///c:/windows/assembly/gac/system.windows.forms/1.0.5000.0__b77a5c561934e089/system.windows.forms.dll
----------------------------------------
System
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.573
CodeBase:
file:///c:/windows/assembly/gac/system/1.0.5000.0__b77a5c561934e089/system.dll
----------------------------------------
System.Drawing
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.573
CodeBase:
file:///c:/windows/assembly/gac/system.drawing/1.0.5000.0__b03f5f7f11d50a3a/system.drawing.dll
----------------------------------------
System.Xml
Assembly Version: 1.0.5000.0
Win32 Version: 1.1.4322.573
CodeBase:
file:///c:/windows/assembly/gac/system.xml/1.0.5000.0__b77a5c561934e089/system.xml.dll
----------------------------------------
************** JIT Debugging **************
To enable just in time (JIT) debugging, the config file for this
application or machine (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.
For example:
<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>
When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the machine
rather than being handled by this dialog.
< - - - - Fine detail - - - - >
cliccando su 'continue' il programma parte, ma non sono riuscito ad
effettuare una connessione al server...
attendo lumi...
grazie mille del tuo aiuto.
Ciao
Ciccio
solo una delucidazione: tu utilizzi le strored procedure sp_tables e
sp_columns????
> Se ti interessa solo il confronto io ho in cantiere lo sviluppo di questo
> tool
>
> http://www.davidemauri.it/dabcos
>
> mi sarebbe piaciuto implementare anche un meccanismo di sincronizzazione (e
> nei miei piani c'è ancora) ma per limiti di tempo non sono mai riuscito a
> completarlo.
Il mio obiettivo è quello di aggiornare la struttura del db popolato di dati
di un applicazione esistente e funzionante.
> In ogni caso il confronto tra due db sulla struttura dei dati, viste e
> stored procedure funziona benone.
Si, e mi piace anche come visualizza le differenze
ciao
Ciccio
Al momento utilizzo (come puoi vedere nei file XML di configurazione) la
stored procedure non documentata sp_MSHelpcolum per le colonne, mentre
utilizzo la vista standard INFORMATION_SCHEMA.TABLES per la lista delle
tabelle.
Ciaooo
--
Davide Mauri
www.davidemauri.it
"ciccio" <cic...@discussions.microsoft.com> wrote in message
news:BCB4668A-434C-415F...@microsoft.com...
io avevo pensato di generare una tabella vuota (uguale alla tabella del DB
aggiornato) nel db di destianzione, per poi riempirla con i dati della
vecchia tabella presente sul db di destinazione;
nel caso sia andato tutto per il verso giusto a questo punto bisognerebbe
effettuare una drop table della vecchia tabella e rinominare quella nuova.
E' una cosa fattibile?????
Ciao
Ciccio
"ciccio" <cic...@discussions.microsoft.com> wrote in message
news:C721BC39-3604-4DA1...@microsoft.com...
> mi dicevi che avevi intenzione di creare un meccanismo per la
> sincronizzazione;
> Ma in che maniera???
>
> io avevo pensato di generare una tabella vuota (uguale alla tabella del DB
> aggiornato) nel db di destianzione, per poi riempirla con i dati della
> vecchia tabella presente sul db di destinazione;
.....mmmm.....io non ho assolutamente tenuto conto dei dati. Il mio tool e
la mia necessità era "semplicemente" quella di confrontare e scoprire le
differenze nella struttura della tabella, non nei dati in essa contenuti.
Se ti server sincronizzare i dati lo puoi fare tranquillamente da DTS o,
meglio ancora, tramite T-SQL. Eccoti un esempio che mostro sempre durante il
corso MOC2072 e MOC 2073:
use tempdb
go
if exists (select * from dbo.sysobjects where id = object_id(N'[Finale]')
and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [Finale]
GO
CREATE TABLE [Finale] (
[ID] [int] NOT NULL ,
[F1] [varchar] (50) NULL ,
[F2] [varchar] (50) NULL ,
CONSTRAINT [PK_Finale] PRIMARY KEY CLUSTERED
(
[ID]
)
)
GO
SET NOCOUNT ON
INSERT INTO Finale VALUES (1, '1', 'a')
INSERT INTO Finale VALUES (2, '2', 'b')
INSERT INTO Finale VALUES (3, '3', 'c')
INSERT INTO Finale VALUES (4, '4', 'd')
INSERT INTO Finale VALUES (11, '5', 'm')
INSERT INTO Finale VALUES (12, '6', 'n')
INSERT INTO Finale VALUES (13, '7', 'o')
INSERT INTO Finale VALUES (14, '8', 'p')
INSERT INTO Finale VALUES (15, '9', 'q')
GO
SET NOCOUNT ON
SELECT * FROM Finale
GO
CREATE TABLE [#TempTable] (
[ID] [int] NOT NULL ,
[F1] [varchar] (50) NULL ,
[F2] [varchar] (50) NULL ,
CONSTRAINT [PK_TempTable] PRIMARY KEY CLUSTERED
(
[ID]
)
)
GO
SET NOCOUNT ON
INSERT INTO #TempTable VALUES (1, 'a', 'a - updated')
INSERT INTO #TempTable VALUES (2, 'b', 'b - updated')
INSERT INTO #TempTable VALUES (3, 'c', 'c - updated')
INSERT INTO #TempTable VALUES (4, 'd', 'd - updated')
INSERT INTO #TempTable VALUES (5, 'e', 'e - added')
INSERT INTO #TempTable VALUES (6, 'f', 'f - added')
INSERT INTO #TempTable VALUES (7, 'g', 'g - added')
INSERT INTO #TempTable VALUES (8, 'h', 'h - added')
INSERT INTO #TempTable VALUES (9, 'i', 'i - added')
INSERT INTO #TempTable VALUES (10, 'l', 'l - added')
GO
SET XACT_ABORT ON
BEGIN TRAN
-- Aggiorno le righe esistenti
UPDATE Finale SET
Finale.F1 = #TempTable.F1,
Finale.F2 = #TempTable.F2
FROM Finale, #TempTable
WHERE Finale.ID = #TempTable.ID
-- Inserisco le nuove righe
INSERT INTO Finale (ID, F1, F2)
SELECT ID, F1, F2 FROM #TempTable T
WHERE T.ID NOT IN (SELECT ID FROM Finale)
COMMIT TRAN
GO
-- Elimino la tabella temporanea
SET NOCOUNT ON
DROP TABLE #TempTable
-- Risultato
SET NOCOUNT ON
SELECT * FROM Finale
GO
> nel caso sia andato tutto per il verso giusto a questo punto bisognerebbe
> effettuare una drop table della vecchia tabella e rinominare quella nuova.
>
> E' una cosa fattibile?????
Si :-)
Se ti server c'è anche questo bellissimo programma, free, che ti risolve
questi problemi:
>
> Ciao
> Ciccio
Bye
--
Davide Mauri
www.davidemauri.it
> ......mmmm.....io non ho assolutamente tenuto conto dei dati. Il mio tool e
> la mia necessità era "semplicemente" quella di confrontare e scoprire le
> differenze nella struttura della tabella, non nei dati in essa contenuti.
[cut]
ti spiego le mike necessità:
ho un applicazione (funzionante e che utilizzo regolarmente)che utilizza un
db (chiamiamolo 'db1'),
effettuo delle modifiche al programma e delle modifiche al db;
a questo punto io ho un programma versione 1.0 (che utilizza 'db1') e un
programma versione 2.0 che utilizza una versione aggiornata di db1 (che
chiameremo db2);
per le modifiche al programma non ci sono problemi, ma per l'aggiornamento
di 'db1' -->> 'db2' come la effettuo??
Non voglio utilizzare dei DTS perchè a volte capita di dover modificare il
tipo di dati di una colonna e questo mi genera degli errori, inoltre avevo
l'intenzione di utilizzare lo stesso tool per diversi tipi di db (in
particolare db di MS foxpro)
ciao
Ciccio
è la stessa situazione che ho vissuto io, per questo mi sono fatto il
DaBCoS.
Il problema fondamentale è la struttura delle tabelle e gli oggetti del db
(SP e VIEW nel mio caso). A questo punto io tramite la mia utility
analizzavo le differenze, e poi modificavo gli oggetti sul db meno
aggiornato. Come? Facendomi generare gli script dal database più aggiornato.
Per le tabelle invece facevo a mano l'alter table necessario.
Per ora l'ultima versione funzionante di DaBCos, ossia la 0.2, permette il
confronto al max fra SQL Server 7 e 2000. Quella su cui sto lavorando
(mooolto lentamente) permetterò il confronto e la sincronizzazione anche su
db diversi. Sono ancora in uno stadio molto inziale però....
--
Davide Mauri
www.davidemauri.it
"ciccio" <cic...@discussions.microsoft.com> wrote in message
news:3FFDC470-9EB2-4660...@microsoft.com...
Stavo provando questo:
use DB1
insert GERARCHIE A
select * from DB2.dbo. B
where A.cod_gerarchia <> B.cod_gerarchia
dove cod_gerarchia è la chiave primaria della tabella.
Ti ringrazio
"Lorenzo Benaglia" ha scritto:
Devi procedere con una triplice istruzione
============================
--eliminazione dei record non piů presenti
DELETE dbo.Destinazione
WHERE PK NOT IN (SELECT PK FROM dbo.Origine)
--aggiornamento dei record modificati
UPDATE
SET campo1 = O.campo1,
campo2 = O.campo2,
...,
campon = O.campon
FROM dbo.Origine O INNER JOIN dbo.Destinazione D
ON O.PK = D.PK
WHERE campo1 <> O.campo1
OR campo2 = O.campo2
OR ...
OR campon = O.campon
--inserimento dei nuovi
INSERT dbo.Destinazione
SELECT O.*
FROM dbo.Origine O LEFT JOIN dbo.Destinazione D
ON O.PK = D.PK
WHERE D.PK IS NULL
============================
Bye
--
Luca Bianchi