2013-06-24 13 views
5

In SQL Server 2008 R2 kann ein Benutzer eine Tabelle mit den Daten erstellen, indem er mit der rechten Maustaste auf die Datenbank klickt und Tasks und Generate Scripts auswählt. Ein Assistent öffnet sich und fragt Benutzer, was sie wollen (mehrere Tabellen, eine Tabelle, etc.) zusammen mit einigen erweiterten Optionen (die es dem Benutzer erlauben, sowohl das Tabellenschema als auch Daten zu erhalten); für Fragen, see this useful post of what's being done (unter "The Handy").Skripttabelle mit Daten aus Code

Leider hat SQL Server kein Skript, um diese Skripte zu generieren, und gelegentlich müssen wir einige Tabellen mit allen darin enthaltenen Daten scripten. Anstatt dies jedes Mal manuell zu tun, dachte ich, es wäre einfacher, eine C# -Anwendung diese Prozesse für eine Testtabelle aufrufen zu lassen und ein Skript für die Tabelle mit allen Daten zu generieren und es als lokale Datei zu speichern.

Wenn ich die SqlConnection verwende, habe ich keine Option gesehen, um diese Art von Aufgabe zu tun (obwohl es mit etwas anderem sein könnte). Wie ist dieser Assistent zugänglich?

Update: Nach der ersten Antwort ging ich davon aus, dass dies nicht möglich war, also habe ich eine interessante Lösung für diejenigen, die mit TSQL vertraut sind, ausgearbeitet. Ich habe eine gespeicherte Prozedur ähnlich den unten:

CREATE PROCEDURE usp_ScriptTableAndData 
AS 
BEGIN 

    CREATE TABLE ScriptTemp(
     Value VARCHAR(8000) 
    ) 

    INSERT INTO ScriptTemp 
    SELECT '/* Build the Reference Table */' 

    INSERT INTO ScriptTemp 
    SELECT 'USE [DB] 
     GO 

     SET ANSI_NULLS ON 
     GO 

     SET QUOTED_IDENTIFIER ON 
     GO 

     SET ANSI_PADDING ON 
     GO 

     CREATE TABLE [dbo].[Table](
      [ID] [int] IDENTITY(1,1) NOT NULL, 
      [Reference] [varchar](50) NULL, 
      [TableDate] [datetime] NOT NULL, 
      [Display] [bit] NULL 
     ) 

     SET ANSI_PADDING OFF 
     GO 


     INSERT INTO ScriptTemp 
     SELECT '/* Insert the Table Values */' 

     INSERT INTO ScriptTemp 
     SELECT 'INSERT INTO Table VALUES(' + CAST(ID AS VARCHAR(3)) + 
      ',' + '''' + LTRIM(RTRIM(ISNULL(Reference,'NULL'))) + '''' + 
      ',' + '''' + CONVERT(VARCHAR(25),TableDate,120) + '''' + 
      ',' + ISNULL(CAST(Display AS VARCHAR(4)),'NULL') + ')' 
     FROM dbo.Table 

     EXECUTE xp_cmdshell 'BCP "SELECT * FROM DB.dbo.ScriptTemp" queryout "\\FileSharePath\Script.sql" -T -c -SSERVER' 

     DROP TABLE ScriptTemp 
END 

Dies ein Skript mit der Tabelle erstellt und Daten (ich habe die Idee von einem ähnlichen Skript, dass Bill Fellows created). Wie auch immer, diese Lösung funktioniert auch und ist ziemlich praktisch für Leute, die mit TSQL vertraut sind. Danke nochmal an alle, die geantwortet haben.

+3

Ich habe Ihren Titel bearbeitet. Bitte lesen Sie "[Sollten die Fragen" Tags "in ihren Titeln enthalten?] (Http://meta.stackexchange.com/questions/19190/)", wobei der Konsens "nein, sie sollten nicht" lautet. –

Antwort

3

Sie sollten SQL Server Management Objects (SMO) überprüfen. Ich habe dies verwendet, um zuvor in .NET-Anwendungen benutzerdefiniertes Skripting zu erstellen, aber ich bin mir nicht sicher, ob es das Scripting von Daten unterstützt.

Von MSDN:

SQL Server Management Objects (SMO) sind Objekte für programmatische Verwaltung von Microsoft SQL Server entwickelt. Sie können mit SMO benutzerdefinierte SQL Server-Verwaltungsanwendungen erstellen.

+2

SMO unterstützt Skriptdaten. Sehen Sie hier für ein Beispiel: http://StackOverflow.com/Questions/5365408/c-sharp-Smo-Scripting-Table-Data-To-file-Throwing-Forror – RBarryYoung

+0

@ahkvk Danke das ist genau das, was ich gesucht habe - genial! – Question3CPO

2

Der Assistent ist eine Funktion der SQL Management Console und nur von dort verfügbar. Es ist nicht Teil der SqlConnection-Klasse oder eines Teils von .NET Framework selbst.

So fragen Sie zum Beispiel, wo sich das Dialogfeld "Schriftarten" befindet, wenn Sie ein Word-Automatisierungsobjekt in Ihrem Code instanziieren.

+0

Es gehört zu SMO im .Net-Framework. Das ist auch, wie SSMS es (größtenteils) tut. – RBarryYoung

+0

@catfood Danke; Vor der anderen Antwort nahm ich an, dass dies nicht möglich war, und verbrachte einige Stunden damit, meine eigene Lösung zu entwickeln, was eine herausfordernde Übung war. – Question3CPO

+0

Und ich habe etwas über SMO gelernt. Danke, RBarryYoung. Tut mir leid, dass ich dich irreführe, Question3CPO. – catfood

0

Sie können diese Operation mit SQL Server Management Studio ausführen. Klicken Sie mit der rechten Maustaste auf Datenbankinstanz -> Aufgabe -> Skripte generieren -> Füllen Sie dann Einführungs- und Füllobjekt (Wählen Sie in den Tabellen das gewünschte Datenskript aus) -> Jetzt unter Skriptoptionen festlegen -> Klicken Sie auf Erweitert und dann auf Allgemein -> Legen Sie den Typ der Daten für das Skript als Daten nur aus dem Schema fest. Sie erhalten das vollständige Datenskript als ausgewählten Speicherort.

+1

Das OP weiß das aufgrund seiner Frage - er fragt, ob es einen Weg gibt, dies von einem API-Standpunkt aus zu tun und nicht durch SSMS gehen zu müssen, um diese Operation durchzuführen. – tsells

1

Die Funktionalität zum Erstellen von Skripten ist nicht in den Sql-Bibliotheken enthalten, sondern in den Visual Studio-Bibliotheken.

z. Microsoft.Data.Schema.ScriptDom.Sql, Microsoft.Data.Schema.SkriptDom;

das Visual Studio Team/a guy Gert Drapers http://blogs.msdn.com/b/gertd/ genannt Arbeitet auf etwas Visual Studio Team System 2008 Database Edition genannt - es geht um jetzt vergessen, aber es ist immer noch dort in VS2010 und VS2012 Enterprise Edition versteckt (oder jeder sein was jetzt namens). Sie haben die Möglichkeit, Schema und Daten aus Datenbanken zu vergleichen, wie haben sie das gemacht? Microsoft schrieb eine Schuppenlast von Klassen, die Sie verwenden können.

Es gibt viele ungenutzte Funktionalität, natürlich beantwortet dies nicht direkt Ihre Frage, (SMO) aber hoffentlich gibt es Ihnen eine Idee, dass es möglich ist und jemand anderes die meiste Arbeit getan hat.

Haben Sie SQLPackage.exe gesehen? Dadurch werden Schema und Daten in eine Zip-Datei gepackt.