clschak
Goto Top

MS-SQL Tabellendaten kopieren und dann löschen

Hi

ich habe von SQL-Scripten nur sehr wenig Kenntnisse, vielleicht kann mir hier einer sagen wie man das schnell und einfach lösen kann, idealerweise mit SQL Scripten face-smile.

Ich habe in einer SQL Datenbank eine Logging Tabelle die allmählich zu groß wird und wo ich einen Teil der Einträge in eine separate DB verschieben möchte, die Einträge können nicht einfach gelöscht werden sollen aber aus der ERP Datenbank verschwinden.

Datenbankfelder der Quellentabelle
SELECT TOP (1000) [timestamp]
      ,[Entry No_]
      ,[Date and Time]
      ,[Time]
      ,[User ID]
      ,[Table No_]
      ,[Field No_]
      ,[Type of Change]
      ,[Old Value]
      ,[New Value]
      ,[Primary Key]
      ,[Primary Key Field 1 No_]
      ,[Primary Key Field 1 Value]
      ,[Primary Key Field 2 No_]
      ,[Primary Key Field 2 Value]
      ,[Primary Key Field 3 No_]
      ,[Primary Key Field 3 Value]
      ,[Record ID]
  FROM [dbname].[dbo].[Tabelle]

Datumsformat:
2010-05-25 07:54:48.187

Was ich nun brauche ist ein Skript das mir die Einträge die älter wie 18 Monate sind in die andere Datenbank kopiert und diese dann aus der ursprünglichen Tabelle löscht, ich hab keine Ahnung wie man das macht face-confused

Vielen Dank schon mal im Voraus face-smile

Gruß
@clSchak

Content-Key: 340204

Url: https://administrator.de/contentid/340204

Printed on: April 20, 2024 at 04:04 o'clock

Member: Looser27
Looser27 Jun 09, 2017 at 16:16:59 (UTC)
Goto Top
Hi,

kannst Du das nicht über das ERP exportieren und anschließend löschen?

Für SQL müssen leider andere ran....

Gruß Looser
Member: clSchak
clSchak Jun 09, 2017 at 16:21:58 (UTC)
Goto Top
Die Tabelle alleine hat eine Größe >300G, die ERP kann das nicht mehr handeln face-confused darum der "harte" Weg.
Member: em-pie
Solution em-pie Jun 09, 2017 at 17:39:58 (UTC)
Goto Top
Moin,

Grundsätzlich kannst du ja Daten mit einem Insert Into... Select... in eine andere Tabelle kopieren:
Hilfe dazu hier oder hier

Dann baust du noch eine Where Bedingung ein, alá
 WHERE MyDate < DATEADD(month, -18, GETDATE()) 
Hilfe: https://msdn.microsoft.com/de-de/library/ms186819.aspx

Löschen dann halt ähnlich:
 DELETE * FROM myTable WHERE MyDate < DATEADD(month, -18, GETDATE()) 

Am besten dazwischen mit Transacts arbeiten, dass wenn etwas in die Buchse geht, man wieder zurück gehen kann...

Gruß
em-pie

P.S. die obigen Hilfen sind für MS SQL ausgelegt, für MySQL wird die Syntax vermutlich ähnlich lauten...
Member: ukulele-7
ukulele-7 Jun 11, 2017 at 12:42:48 (UTC)
Goto Top
Ich glaube nicht das MySQL überhaupt 300GB in einer Tabelle speichern kann face-smile

Vielleicht solltest du erstmal einen kleineren Teilbestand wählen und Testweise in die neue Tabelle übertragen.
Member: clSchak
clSchak Jun 12, 2017 at 09:39:00 (UTC)
Goto Top
Hi

vielen Dank für die Antworten, ich habe die originale Datenbank bereits kopiert face-wink im Live-Betrieb das mal eben "testen" wäre dann doch eher kontraproduktiv.

Das Script sieht nun wie folgt aus:
SET IDENTITY_INSERT Tabelle ON


 insert into Ziel-Tabelle

(     
       [Entry No_]
      ,[Date and Time]
      ,[Time]
      ,[User ID]
      ,[Table No_]
      ,[Field No_]
      ,[Type of Change]
      ,[Old Value]
      ,[New Value]
      ,[Primary Key]
      ,[Primary Key Field 1 No_]
      ,[Primary Key Field 1 Value]
      ,[Primary Key Field 2 No_]
      ,[Primary Key Field 2 Value]
      ,[Primary Key Field 3 No_]
      ,[Primary Key Field 3 Value]
      ,[Record ID]
      )

SELECT 
       [Entry No_]
      ,[Date and Time]
      ,[Time]
      ,[User ID]
      ,[Table No_]
      ,[Field No_]
      ,[Type of Change]
      ,[Old Value]
      ,[New Value]
      ,[Primary Key]
      ,[Primary Key Field 1 No_]
      ,[Primary Key Field 1 Value]
      ,[Primary Key Field 2 No_]
      ,[Primary Key Field 2 Value]
      ,[Primary Key Field 3 No_]
      ,[Primary Key Field 3 Value]
      ,[Record ID]

FROM Quellentabelle
	WHERE convert(date,Quellentabelle.[Date and Time]) < DATEADD(month, -18, GETDATE()
) 

Das convert() war erforderlich weil der Zeitstempel YYYY-MM-DD HH:MM:SS:MMMM war und dann die Bedingung mit den -18 Monaten nicht gegriffen hat.