Laden...

leere Tablle erstellen mit selben strukture einer anderen

Erstellt von TiTime vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.438 Views
T
TiTime Themenstarter:in
68 Beiträge seit 2006
vor 14 Jahren
leere Tablle erstellen mit selben strukture einer anderen

Hi Leute,

Ich verwende SQL Server 2005 und hab ein Problem beim erstellen einer Procedure.
In dieser Procedure ist es notwendig aus einer bestehenden Tabelle zufällig n Elemente auszuwählen und in einer neuen Tabelle zu duplizieren.

Folgenden Code der funktionieren würde kann ich nicht verwenden weil er nicht performant ist, da n sehr groß ist (mit groß meine ich HunderteTausend bzw. Millionen) :


SELECT Top(n) * INTO destinationTable FROM sourceTable ORDER BY NEWID()

Daher habe ich mir überlegt ich könnte doch n mal

SELECT @RandomInteger = ((@MaxValue + 1) - @MinValue) * RAND() + @MinValue

ausführen und damit selber den primary key berechnen um dann in einer Temp Tabelle hinzufügen. Funktioniert in der Theorie ja auch und ist wesentlich schneller.


INSERT INTO #destinationTable
   SELECT *  FROM sourceTable WITH (NOLOCK) 
   WHERE EM_Mail.MailID = @randomNumber

Dieser Code wird in einer Schleife n mal ausgeführt und @randomNumber wird neu berechnet.

Das Problem was ich habe ist:

Wenn ich ein CREATE TABLE destination TABLE mache müsste ich eine Liste mit Spalten angeben. Das Problem ist, das die SourceTabelle über 40 Spalten hatt und das hinschreiben will ich mir ersparen.

Wenn kein CREATE TABLE mache sondern z.B.: folgendes.

 SELCET TOP(0) * INTO destinationTABLE FROM sourceTable 

habe ich zwar eine Tabelle mit richtiger Struktur, aber das insert funktioniert nicht, weil

An explicit value for the identity column in table '#tmp_RandomSelect' can only be specified when a column list is used and IDENTITY_INSERT is ON Führt wieder dazu das das insert die List mit 40 Spalten benötigt.

Nun suche ich nach einer Lösung wo ich sowas wie CREATE TABLE destinationTable LIKE sourceTable , dann würde das INSERT auch funktionieren. Oder es weiß jemand eine andere Lösung wie ich einen Tabelle erstellen kann die nur ein Auszug aus der orgnialen ist und wo die einträge zufällig sind.

Danke im Vorraus!

1.696 Beiträge seit 2006
vor 14 Jahren

Hallo,

SELECT * INTO newTable FROM oldTable WHERE 1=2

legt eine leere Tabelle mit identischen Struktur an. So war es zumindest bis MS SQL 2K. Ob bei 2005 und 2008 auch so ist, weiss ich nicht.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

1.564 Beiträge seit 2007
vor 14 Jahren

Hallo

Ich persönlich präferiere:
:::{style="color: "green";"}-- Ohne Klammern für SSE2k

@vbprogger
"WHERE 1 = 2" funktioniert unter SSE2k5 und SSE2k8 auch noch 😉.

Ist aber Geschmackssache. Der Execution-Plan ist bei beiden Methoden gleich.

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

T
TiTime Themenstarter:in
68 Beiträge seit 2006
vor 14 Jahren

Hi, danke für die Vorschläge

Aber das Problem ist diese statement funktionieren zwar aber ich muss dann wie schon beim Beitrag geschrieben im Insert den Haufen an Feldern angeben, und eine Identity_Insert auf On stellen. Das ist somit nur eine verlagerung meines Problems an eine andere Stelle.

Ich hätte eher was gesucht eine leere Tabelle zu erstellen die dieselbe Datenstruktur hat und man neue Datensätze ohne Probleme inserten kann.

1.696 Beiträge seit 2006
vor 14 Jahren

Ah, jetzt verstehe ich dein Problem. Es geht also um die Identity-Spalte, du kannst diese Eigenschaft an und abschalten, guckst du hier: SET IDENTITY_INSERT

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

1.564 Beiträge seit 2007
vor 14 Jahren

Hi

Sorry, hatte nicht richtig gelesen...

Wie wär's mit einem dynamischen SQL Statement? Du kannst dir aus INFORMATION_SCHEMA.COLUMNS die Spalten holen und entweder über String-Verknüpfung oder über den "FOR XML PATH('')"-Hack ein SQL Statement zusammenbauen und über sp_executesql ausführen. So kannst du die IDENTITY-Spalte ausschließen.

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.