Benutzer mit den meisten Antworten
Problem mit SQL Script beim kopieren von Tabellen

Frage
-
Hallo Community,
Ich habe eine Frage an euch.
Kurfe Info zur Infrastruktur:
************************
1 x Quellserver ( SQL SERVER 2005)
1 x Zielserver (SQL SERVER 2000)
Ich habe auf dem Quellserver eine Datenbank mit mit mehreren Spalten .
Jetzt möchte ich auf den Zielserver die Tabelle mit der Spalte JOBID von dem Quellserver übertragen.
Das mache ich mit folgendem Script:
Das Script auf dem Quellserver ausgeführt
****************************
insert into [Zielserver].test.dbo.Info
(
jobid, appid, jobinitfrom, clientname, idataagent, instance, backupset, subclient,
data_sp, backuplevelInt, backuplevel, incrlevel, jobstatusInt, jobstatus, jobfailedreason, startdateunixsec, enddateunixsec, startdate, enddate, durationunixsec, duration, numstreams, numbytesuncomp,
numbytescomp, numobjects, isAged, isAgedStr
)
Select
jobid, appid, jobinitfrom, clientname, idataagent, instance, backupset, subclient,
data_sp, backuplevelInt, backuplevel, incrlevel, jobstatusInt, jobstatus, jobfailedreason, startdateunixsec,
enddateunixsec, startdate, enddate, durationunixsec, duration, numstreams, numbytesuncomp, numbytescomp, numobjects, isAged, isAgedStr
from Datenbank.dbo.info Q
where NOT EXISTS
(Select 1
from [Zielserver].test.dbo.Info Z
where Z.jobid = Q.jobid)
Das Problem ist jetzt das er auf dem Zielserver an jeden JOBID eine .0 dranhängt z.B (544534.0) (Original: 544534)
Wenn jetzt auf dem Quellserver neue JOBIDS hinzu kommen, soll er bei der nächsten Ausführung nur noch die neu dazugekommenen JOBIDS übertragen.
Wenn nur eine neue JOBID dazugekommen ist, macht er es ohne Probleme. Jetzt habe ich aber 1 Woche nix machen können und habe das Script nochmal ausgeführt,
vorher habe ich folgendendes ausgeführt:
select count (jobid)
from Quellserver //5033 Stück
select count (jobid)
from Zielserver //5001 Stück
obwohl nur 32 neue JOBIDS dazugekommen sind, sagt er mir 1034 Arrows effcted
Weiss einer anhand des Scriptes wo mein Fehler liegt.
Der Sinn des Scriptes ist das es 3 Quellserver gibt und alle JOBIDS auf den Zielserver übertragen werden sollen. Auf dem Zielserver sollen alle JOBIDS aber nur einmal vorkommen.
Ich hoffe es kann mir einer helfen.
Antworten
-
Hi,
warum in aller Welt nimmt man für einen ID Wert real oder ähnliches als Datentyp?
http://msdn.microsoft.com/de-de/library/ms173773.aspx
Dann ist es wohl so, dass SQL 2000 diesen Wert anders darstellt. Allerdings scheint der Vergleich ja zu funktionieren, von daher dürfte es egal sein.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort vorgeschlagen Stefan HoffmannModerator Freitag, 6. Mai 2011 12:01
- Nicht als Antwort vorgeschlagen Stefan HoffmannModerator Freitag, 6. Mai 2011 12:01
- Als Antwort vorgeschlagen Stefan HoffmannModerator Freitag, 6. Mai 2011 12:02
- Als Antwort markiert Robert BreitenhoferModerator Montag, 30. Mai 2011 15:51
Alle Antworten
-
Hi,
ich würde die WHERE Klausel so schreiben:
WHERE jobid NOT IN ( SELECT jobid FROM [Zielserver].test.dbo.Info )
Welchen Datentyp hat "jobid" denn in den Tabellen beider Datenbanken? Ist das eine evtl. ein numerischer Wert, das andere varchar o.ä.?
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hi,
warum in aller Welt nimmt man für einen ID Wert real oder ähnliches als Datentyp?
http://msdn.microsoft.com/de-de/library/ms173773.aspx
Dann ist es wohl so, dass SQL 2000 diesen Wert anders darstellt. Allerdings scheint der Vergleich ja zu funktionieren, von daher dürfte es egal sein.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort vorgeschlagen Stefan HoffmannModerator Freitag, 6. Mai 2011 12:01
- Nicht als Antwort vorgeschlagen Stefan HoffmannModerator Freitag, 6. Mai 2011 12:01
- Als Antwort vorgeschlagen Stefan HoffmannModerator Freitag, 6. Mai 2011 12:02
- Als Antwort markiert Robert BreitenhoferModerator Montag, 30. Mai 2011 15:51
-
Hi,
mit Not In funktioniert es leider auch nicht, obwohl nur 3 neue jobids dazu gekommen sind, sagt er 88 Arrows effected.
dann stimmt eher irgendwas mit deinen Datenbanken nicht. Lass dir für beide Datenbanken bitte mal ein CREATE TABLE Skript erzeugen und poste die dann hier. Dann kann man evtl. eher sehen, wo der Vergleich nicht passt.
Ich würde aber dennoch auf int als PrimaryKey Datentyp setzen, nicht auf sowas IMHO abstruses wie real. Für einen Test könntest Du das mal ausprobieren. Da Du anscheinend ja ein nur ganzzahlige Werte hast, wäre das IMHO die sinnvollste Lösung.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hey,
meine zieldatenbank habe ich so generiert ( original COde von der Quelldatenbank)
CREATE TABLE [test] (
[jobid] [real] NULL ,
[appid] [int] NOT NULL ,
[jobinitfrom] [varchar] (12) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[clientname] [nvarchar] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[idataagent] [varchar] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[instance] [nvarchar] (512) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[backupset] [nvarchar] (128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[subclient] [nvarchar] (128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[data_sp] [varchar] (144) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[backuplevelInt] [int] NOT NULL ,
[backuplevel] [varchar] (29) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[incrlevel] [int] NOT NULL ,
[jobstatusInt] [int] NOT NULL ,
[jobstatus] [varchar] (15) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[jobfailedreason] [nvarchar] (1024) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[startdateunixsec] [int] NOT NULL ,
[enddateunixsec] [int] NOT NULL ,
[startdate] [datetime] NULL ,
[enddate] [datetime] NULL ,
[durationunixsec] [int] NOT NULL ,
[duration] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[numstreams] [int] NOT NULL ,
[numbytesuncomp] [bigint] NOT NULL ,
[numbytescomp] [bigint] NOT NULL ,
[numobjects] [bigint] NULL ,
[isAged] [int] NOT NULL ,
[isAgedStr] [varchar] (3) NOT NULL
) ON [PRIMARY]
GOvielleicht kommt die Zieldatenbank SQl 200 mit den Realwerten nicht klar.
-
Hi,
vielleicht kommt die Zieldatenbank SQl 200 mit den Realwerten nicht klar.
mag sein. Ich denke, dass es am (IMHO absolut ungeeigneten) Datentyp (für einen PK Wert) liegt. Probier bitte mal aus, ob es mit int geht. Ich denke: Ja, wird gehen :)
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community