2017-11-29 10 views
-3

Microsoft.SqlServer.Management.Smoクラスを使用してテーブルの作成スクリプトを取得しようとしています。 GO文を内部に持つスクリプトを取得したい。しかしSMOはデータベースからすべてのGO文とUSEを省いた。SMOを使用してGOステートメントを使用してテーブルのスクリプトを作成

例: - 管理スタジオから生成されたスクリプトを作成します。

USE [Testing_BlankData_1_Staging] 

GO 

SET ANSI_NULLS ON 

GO 

SET QUOTED_IDENTIFIER ON 

GO 

CREATE TABLE [dbo].[stgUser](
    [UserName] [nvarchar](100) NOT NULL, 
    [FullName] [nvarchar](100) NULL, 
    [Title] [nvarchar](100) NULL, 
    [Department] [nvarchar](100) NULL, 
    [Role] [nvarchar](100) NULL 
) ON [PRIMARY] 

GO 

私は管理スタジオの正確なコピーをしたい

SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON CREATE TABLE [dbo].[stgUser]( [UserName] [nvarchar](100) NOT NULL, [FullName] [nvarchar](100) NULL, [Title] [nvarchar](100) NULL, [Department] [nvarchar](100) NULL, [Role] [nvarchar](100) NULL ) ON [PRIMARY] 

SMO

使用してスクリプトを作成します。

私はfalseNoCommandTerminatorを設定することをお勧め同じ

public void GenerateScript() 
{ 
    string sqlServer = "My SQL Server instance"; 
    string sqlLogin = "login"; 
    string sqlPassword = "password" 
    string sqlDatabase = "Testing_BlankData_1_Staging"; 


    Server server = new Server(sqlServer); 

    server.ConnectionContext.LoginSecure = true; 
    server.ConnectionContext.Login = sqlLogin; 
    server.ConnectionContext.Password = sqlPassword; 
    server.ConnectionContext.Connect(); 

    foreach (Table table in server.Databases[sqlDatabase].Tables) 
    { 

     StringBuilder sb = new StringBuilder(); 

     ScriptingOptions options = new ScriptingOptions(); 
     options.ClusteredIndexes = true; 
     options.Default = true; 
     options.DriAll = true; 
     options.Indexes = true; 
     options.IncludeHeaders = true; 
     options.AnsiPadding = true; 

     StringCollection coll = table.Script(options); 

     foreach (string str in coll) 
     { 
      sb.Append(str); 
      sb.Append(Environment.NewLine); 
     } 

     try 

     { 
       string path = "Any path " + table.Name + ".sql"; 
       System.IO.StreamWriter fs = System.IO.File.CreateText(path); 
       fs.Write(sb.ToString()); 
       fs.Close(); 
     } 
     catch (Exception ex) 
     { 

     } 
    } 
} 
+0

両方のステートメントを実行すると、実際に同じステートメントになります。データベースが接続文字列にあり、GOが暗黙的である場合、データベースを指定する必要はありません –

+0

['ScriptBatchTerminator'](https://msdn.microsoft.com/en-us/library/microsoft.sqlserver)。 manage.smo.scriptingoptions.scriptbatchterminator.aspx) –

+0

options.ScriptBatchTerminator = trueを使用します。しかし、依然として同じ結果、GO文は照会されていません。 –

答えて

0

のコードを検索してください。..示唆してください。

ScriptingOptions.NoCommandTerminatorプロパティ

偽(デフォルト)場合はtrueを、個々の のTransact-SQL文が生成されたスクリプト

で区切られていない場合は、個々のTransact-SQLステートメントを使用して で区切られます接続固有のコマンドターミネータ。

ScriptBatchTerminator~trueも設定することを検討してください。

関連する問題