Autor Beitrag
schredderer
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 11.10.12 08:30 
Hallo zusammen,

Ich bin momentan daran ein Tabellenkopierprogramm in Delphi XE3 zu schreiben. Man kann sich die Datenbanken und deren Tabellen von einem sogenannten 'Quell-Server' auflisten lassen, eine oder mehrere Tabellen auswählen und per Click diese auf einen 'Ziel-Server' kopieren. Dazu wird vom Programm ein 'CREATE TABLE Script' erstellt und auf dem 'Ziel-Server' eingespielt. Es wird aber NICHT der Inhalt einer Tabelle kopiert, sondern nur die Struktur (Spalten, Datentypen, Primary Key, etc.), das soll auch so sein.
Problem ist, dass das Ganze einiges an Rechenleistung benötigt, weil ständig ein Datenaustausch zwischen Delphi und dem SQL-Server stattfindet.

Jetzt kann ich mir ja aber, wenn ich im 'SQL Server 2005' mit Rechtsklick auf eine Tabelle klicke, mit dem Befehl:
- Script Table as
-- CREATE TO
--- New Query Editor
--- File
--- Clipboard
ein 'CREATE TABLE Script' erstellen lassen, und dieses entweder in einem neuen 'Query Editor', einer externen Datei oder im Clipboard anzeigen lassen.

Meine Frage bzw meine Vermutung ist jetzt, dass es für diese Befehle, doch sicher eine 'Stored Procdure' gibt. Das ich diese 'Stored Procedure' paraktisch über Delphi aufrufe, den Tabellennamen als Parameter mit übergebe und es mir den fertigen 'CREATE TABLE Befehl' als Datei ausspuckt.

Ich hoffe ihr könnt mir helfen!
Schonmal DANKE!! :-)
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Do 11.10.12 10:54 
ausblenden volle Höhe SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
Create Procedure P_GETTableCreateScript(@TableName Nvarchar(100)) 
-- 20121011 by Thomas Wassermann
-- only Structure
-- No Triggers,Foreignkeys,Indizes ... 
With Execute as OWNER
as
Declare @Name NVarchar(500)
Declare @Col NVarchar(500)
Declare @Colorder int
Declare @prec int

Declare @Nullable bit
Declare @FeldTyp Nvarchar(500)
Declare @Vorgabe Nvarchar(500)
Declare @SQL Nvarchar(4000)

DECLARE Tab_Cursor CURSOR FOR 
Select Distinct * from
(
Select  m.Name,syscolumns.name as Col,syscolumns.colorder
,Case when syscolumns.scale is NULL and  systypes.name<>'bit' then syscolumns.prec else null end as prec,syscolumns.isnullable,systypes.name as FeldTyp
,syscomments.text as Vorgabe
from syscolumns
Join sysobjects m ON m.xtype ='U' and m.Name=@TableName
join systypes on syscolumns.xtype=systypes.xtype and syscolumns.xusertype=systypes.xusertype
Left join sysobjects on sysobjects.xtype='D' and sysobjects.parent_obj=syscolumns.id 
Left Join syscomments on  syscomments.id=syscolumns.cdefault
where syscolumns.id=m.ID 
) a
Order by colorder

OPEN Tab_Cursor

FETCH NEXT FROM Tab_Cursor 
INTO @Name,@Col,@Colorder,@prec,@Nullable,@FeldTyp,@Vorgabe
Select @SQL='CREATE TABLE [' + @Name + ']' + Char(13) + Char(10) +'(' 
WHILE @@FETCH_STATUS = 0
BEGIN
    Select @SQL = @SQL + '[' + @Col + '] [' + @FeldTyp + ']' 
                       + Case When @prec<>0 then  ' ('+Cast(@Prec as Varchar(10))+')' else '' end
                       + Case When @Nullable=1 then ' NULL' else ' NOT NULL' end 
                       + Coalesce(' DEFAULT '+@Vorgabe,''
                       + ','
  FETCH NEXT FROM Tab_Cursor 
  INTO @Name,@Col,@Colorder,@prec,@Nullable,@FeldTyp,@Vorgabe
END
Select @SQL=SubString(@SQL,1,Len(@SQL)-1) + Char(13) + Char(10)+')'
CLOSE Tab_Cursor
DEALLOCATE Tab_Cursor

Select @SQL as

Moderiert von user profile iconNarses: Code- durch SQL-Tags ersetzt
Einloggen, um Attachments anzusehen!
schredderer Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 11.10.12 11:22 
Hey danke für die schnelle Antwort :-)

Wenn ich dein Script nun im SQL Server 2005 ausführe wird die Procedure angelegt.
Dann rufe ich diese folgendermaßen auf:
EXEC master.dbo.P_GETTableCreateScript @TableName=N'Tabellenname'

Soweit, sogut. Aber wo finde ich jetzt die Datei, bzw wird überhaupt eine Datei geschrieben?
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Do 11.10.12 13:14 
bei der Implementierung bekommst Du ein Resultdataset

Select @SQL as [SQL]

AdoQuery.Commandtext := .....
AdoQuery.Open;
AdoQuery.Fields[0].asString

Da Du die Prozedur auf Master angelegt hast bekommst Du zudem nur Ergebnisse für Abfragen aus master.

gegf. baust Du Dir das ganze besser als Parametrisierte Abfrage um ... Du benötigst dann allerdings ausreichend Rechte mit Deiner Anmeldung ..

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
schredderer Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 16.10.12 09:58 
Ich rufe die Procedure mit

USE ['Datenbankname']
EXEC master.dbo.P_GETTableCreateScript @TableName=N'Tabellenname'

dann kann die Funktion ja auch in master liegen.


Auf jeden Fall hab ich es jetzt hinbekommen.
Danke vielmals! :-)