Zum Inhalt springen

MS SQL Server 2005 - Tabellen kopieren


Mr. Tommes

Empfohlene Beiträge

Hallo, habe folgendes Problem: Hab den Auftrag bekommen, eine MS SQL Server 2005 Tabelle aus einer Datenbank zu kopieren. 1 zu 1. Inklusive Indexes, StoredProcedures, Statistics etc.

Das ganze soll in C# umgesetzt werden, was aber eher nebensächlich ist.

Das Endergebnis soll ein SQL Script sein, das, wenn man es z.B. im MS SQL Server 2005 Management Studio auf dem Server ausführt, mir die Tabelle, aus der ich das Script erzeugt habe, wiederherstellt, bzw. in einer anderen Datenbank einfügt.

Also es sollen alle Daten im SQL Script enthalten sein. Weiß jemand wie ich das umsetzen kann??? :eek

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi

Probier mal folgendes Statement auf dem Server aus:

select * into <Neue Tabelle> from <zu kopierende Tabelle>;

Dieses Skript schreibt dir alles von der zu kopierenden Tabelle in die Neue Tabelle, die noch gar nicht existiert und dadurch angelegt wird.

Jedoch weiß ich leider nicht ob dann auch die Indizes mit kopiert werden. Hab ich noch nicht probiert.

Gruß

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich glaub es geht eher darum, ein Create Table Script incl. aller Constraints und Indices zu generieren und nicht darum die Daten von A nach B zu verschieben.

Sofern MSSQL kein Package a la DBMS_METADATA anbietet, muss man hierzu über die Metatabellen der Datenbank gehen und sich das ganze selbst zusammenbauen.

Dim

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dim hat Recht.

aber wo ich nun verwirrt bin. Tabelle oder komplette Datenbank? Denn eine Tabelle hat "keine" Stored Procedures. Sind abhängige Objekte gemeint?

Also kopieren eine Tabelle mit Indizes, Constraints etc. geht halt nur mit Script (Create-Script generieren lassen) und dann mit INSERT INTO befüllen.

und ein SELECT INTO erzeugt nur eine Kopie der Daten ohne Indizes etc.

Aber immer noch gut auch eine leere Kopie zu erzeugen ist:

SELECT * INTO <NEUTAB> FROM <ALTTAB> WHERE 0=1

tschöö

B

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin zusammen,

Seit SQL-Server 2000 wird eine API für Datenbank-Operationen angeboten. Seit SQL-Server 2005 ist gibt es das ganze auch mit .NET-Bibliotheken. Nennt sich SQL Server Management Objects (SMO). Kleine Beispiele gibt es dazu in der MSDN oder beim SQLTeam (letzteres enthält auch den Link zu einer Anwendung, die das Scripten schon in gänze können soll... hab ich aber nicht ausprobiert).

Damit solltest du soweit an alle Objekte via Code kommen. Grundsätzlich unterstützen sie glaube ich alle die Script()-Methoden mit denen du das SQL-Script des Objektes bekommst. Leider habe ich keine Ahnung ob die Methode den Export von Daten unterstützt. Ich glaube nicht. Dafür wäre die Idee beim Scripten einer Tabelle, sich ein INSERT-Script zu generieren mittels einer Select-Anweisung


SELECT 'INSERT INTO  [i]<Tabelle>[/i]  ([i]<Spalte1>[/i]) VALUES (' + quotename(Spalte1, '''') + ')' FROM Tabelle

Gruß,

Honky

Link zu diesem Kommentar
Auf anderen Seiten teilen

Rein interessehalber: Macht es einen Unterschied, ob ich das nehm oder schreib

CREATE TABLE <NewTab> AS (SELECT * FROM <OldTab> WHERE 0=1);

:confused:

hmm unter Microsoft SQL Server wäre mir das nicht bekannt, ob das überhaupt geht.

greets

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstmal Danke für all die vielen Antworten.

Also stimmt, habe mich unklar ausgedrückt. Muss eine Tabelle 1 zu eins kopieren mit Constraints, Indizes etc. Ziel ist es, ein Create Script zu erzeugen.

Soll das ganze wie gesagt in C# schreiben. Die Lösung mit den SMO (Server Management Objects) habe ich hinbekommen, funktioniert wunderbar, sogar mit Daten. Nur leider will mein Chef das so nicht haben. Er hätte gerne eine DLL die er im SQL Server einbetten kann und dann die von mir geschriebene Funktion CopyTable() aufruft.

Hab aber keine Ahnung, wie ich das Script erzeugen soll. Mein Problem fängt schon da an, dass ich nicht weiss, welche Informationen alle in einer Tabelle enthalten sind und wie ich diese mit SQL abfragen kann.

Mein Ansatz zur Lösung wäre SQL Anfragen stellen wie z.B. "select name from dbo.sysobjects where Type ='U'" um alle Tabellennamen herauszufinden. Und dann halt CREATE (den gewählten Tabellennamen). Das ganze halt so weiter... Spalten ermitteln und anlegen... aber das muss doch auch irgendwie einfacher gehen, oder??? :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

Wenn du SMO im Griff hast, kannst du den Code doch auch in eine Assembly (dll) packen und via CLR Integration in den Server installieren. .NET-Funktionen lassen sich dann so aus dem normalen T-SQL heraus nutzen, z.B. dann auch durch deine CreateScript-Funktion.

Introducing SQL Server 2005's CLR Integration (devsource)

Introduction to SQL Server CLR Integration (msdn)

Der andere Weg über Systemtabellen geht natürlich auch, ist aber IMHO höllenkompliziert und unangebrachter Mehraufwand gegenüber der anderen Lösung. (Andererseits kennst du dann das SQL Server Innenleben recht gut :D)

Gruß,

Honky

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...