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-ID: 340204

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

Ausgedruckt am: 23.11.2024 um 11:11 Uhr

Looser27
Looser27 09.06.2017 um 18:16:59 Uhr
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
clSchak
clSchak 09.06.2017 um 18:21:58 Uhr
Goto Top
Die Tabelle alleine hat eine Größe >300G, die ERP kann das nicht mehr handeln face-confused darum der "harte" Weg.
em-pie
Lösung em-pie 09.06.2017 um 19:39:58 Uhr
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...
ukulele-7
ukulele-7 11.06.2017 um 14:42:48 Uhr
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.
clSchak
clSchak 12.06.2017 um 11:39:00 Uhr
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.