Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

DTS Paket

Empfohlene Antworten

Veröffentlicht

DTS Pakete

Ich habe da eine Frage:

Also ich habe zwei Tabellen TA und TAA, in der Tabelle TA steht einen Wert jetzt muß ich mit dem Wert in der Tabelle TAA gehen und den Wert wenn nicht in der Tabelle TAA vorhanden inserten und dann noch updeten das Datum auf „unbegrenzt“

Wenn aber vorhanden inserten , Datum von altem Wert auf insert Datum setzen und in neuem Wert auf „unbegrenzt“ setzen.

Das ganze habe ich mit cursor gemacht.

Wer aber cursor von SQL Server kennt weis dass, die ganze sache nicht grade schnell ist

Deswegen überlege ich es mir ob ich nicht dazu einen DTS Paket programmieren soll.

Was denkt Ihr wird es mit einem DTS schneller ????

Was denkt Ihr wird es mit einem DTS schneller ????

Kurze Frage - klare Antwort: yep

Die Data Transformation Services (DTS) sind auf das Im- und Exportieren, das Konsolidieren und das Transformieren von Daten spezialisiert. Es ist ihr einziger Lebenszweck.

Weil DTS zunächst einen aufwändigen Optimierungsprozess durchläuft, den du (normalerweise) nicht ausführst.

Beispielsweise werden Indizes aktualisiert, die Prozedur vorkompiliert, und verschiedene andere Einstellungen vorgenommen, die einzig der Beschleunigung der Aufgabe dienen --- und all das noch bevor die erste Zeile im- oder exportiert wird.

Was mich aber erheblich irritiert, ist die Frage, warum du für einen so einfachen Vorgang, wie du ihn oben beschreibst, einen Cursor verwendest.

  • Autor

Moment, alles was du da oben geschrieben hast passiert genau so im Query ( die Prozedur wird nur einmal kompiliert und zwar beim Erstellung ) aber egal.

Wie kannst du es bitte aber ohne Cursor lösen.

Da mein Beispiel :


CREATE procedure pTest
as
declare @satz char(1)
declare @do_insert tinyint
declare @do_update tinyint
declare @pws int
declare @datum smalldatetime
declare @maxdatum datetime

declare cur1 cursor FAST_FORWARD for
select satz, pws, datum from TA
open cur1
fetch next from cur1 into @satz, @pws, @datum
while @@fetch_status = 0
begin
select @maxdatum = max(datum) from TAA where pws=@pws
if (@maxdatum is null or @datum > @maxdatum)
begin
select @do_insert = 0;
select @do_update = 0;

if (@satz = 'I')
select @do_insert = 1;

if (@satz = 'D')
select @do_update = 1;

if (@satz = 'U') begin
select @do_insert = 1;
select @do_update = 1;
end

if (@do_update = 1) begin
UPDATE [TAA] SET [GBDatum]=dateadd(day, -1, @datum)
WHERE pws=@pws and datum=(select max(datum) from TA aa where aa.pws=@pws)
end

if (@do_insert = 1) begin
INSERT INTO [TAA]([PWS], [Datum], [GBDatum])
SELECT [PWS], [Datum], '31.12.9999'
FROM TA ah
WHERE ah.pws=@pws and ah.Datum=@datum
end
end
fetch next from cur1 into @satz, @pws, @datum
end
close cur1
deallocate cur1
GO

[/PHP]

Moment, alles was du da oben geschrieben hast passiert genau so im Query

Negative, sir.

Tatsächlich wird die Prozedur kompiliert, aber sie wird lediglich mit den Standardoptionen "optimiert".

Indizes hingegegen werden nicht aufgefrischt, und ... und ... und

Während Queries ihre Daseinsberechtigung haben, wenn es um "schnell mal zwischendurch" geht, sind die DTS darauf geeicht, massenhaft Daten zu verschieben. Ihr ganzer Lebensinhalt ist es, hunderttausende von Datensätzen - so schnell wie irgend möglich - zu sichten, zu konsolidieren, zu transformieren und anschließend an die verschiedensten Ziele zu übertragen.

Daher ist es z.B. angebracht, entsprechend den Anforderungen die Isolationslevel anzupassen. Wer macht das in jeder Query?

Weiterhin ist es oft angebracht, die Tabelle(n) auf BulkInserts vorzubereiten. Wer macht das in jeder Query?

Nicht zuletzt, aber imho ausreichend für eine oberflächliche Darlegung, aktualisiert DTS die Seitenfragmente, um die Tabellen möglichst effektiv lesen und schreiben zu können. Wer macht das in jeder Query?

Zu deiner query:

Natürlich ist ein Cursor möglich, aber was hältst du davon, dem Optimierer eine Chance zu geben, und die Aufgabe in die eigentlichen zwei Abschnitte einzuteilen, die du ja auch tatsächlich vornimmst?

-- vorhandene Daten aktualisieren

update taa

set gbdatum = (select dateadd(day, -1, datum) from ta where pws = taa.pws)

where pws = (select pws from ta where pws = taa.pws and satz in ('D', 'U'))

go	

-- neue Daten eintragen

insert into taa (pws, datum, gbdatum)

select pws, datum, convert(datetime, '31.12.9999', 104) 

from ta

where pws not in (select pws from taa) and satz in ('I', 'U')

go

Beide Batches können zusammenhängend ausgeführt werden.

Damit werden zunächst alle Daten in taa aktualisiert, wenn sie in beiden Tabellen vorhanden sind. Anschließend werden alle Daten von ta nach taa kopiert, und mit maxDatum versehen, wenn sie dort noch nicht vorhanden sind.

(Ist das Attribut "satz" ein notwendiges Attribut, oder handelt es sich lediglich um ein Hilfsattribut?)

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.