Mr. Tommes Geschrieben 15. Mai 2008 Teilen Geschrieben 15. Mai 2008 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Schmarrer Geschrieben 15. Mai 2008 Teilen Geschrieben 15. Mai 2008 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ß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mr. Tommes Geschrieben 16. Mai 2008 Autor Teilen Geschrieben 16. Mai 2008 Klappt leider gar nicht Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Schmarrer Geschrieben 16. Mai 2008 Teilen Geschrieben 16. Mai 2008 Wie gar nicht? Den Tabelleninhalt sollte der SQL Server 2005 zumindest kopieren, da bin ich mir sicher. Oder meinst du die Indizes funktionieren nicht? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 16. Mai 2008 Teilen Geschrieben 16. Mai 2008 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Buell Geschrieben 16. Mai 2008 Teilen Geschrieben 16. Mai 2008 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 16. Mai 2008 Teilen Geschrieben 16. Mai 2008 SELECT * INTO <NEUTAB> FROM <ALTTAB> WHERE 0=1 Rein interessehalber: Macht es einen Unterschied, ob ich das nehm oder schreib CREATE TABLE <NewTab> AS (SELECT * FROM <OldTab> WHERE 0=1); :confused: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Honkytonk Geschrieben 16. Mai 2008 Teilen Geschrieben 16. Mai 2008 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Buell Geschrieben 16. Mai 2008 Teilen Geschrieben 16. Mai 2008 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mr. Tommes Geschrieben 19. Mai 2008 Autor Teilen Geschrieben 19. Mai 2008 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??? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Honkytonk Geschrieben 28. Mai 2008 Teilen Geschrieben 28. Mai 2008 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 ) Gruß, Honky Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.