【发布时间】:2021-02-17 00:21:09
【问题描述】:
我正在开发一个 C# 应用程序来生成脚本。我在下面有以下设置,但正在为其他模式生成表/插入语句。我只想要一个特定的架构以及其中的所有架构/数据。
我尝试设置 options.WithDependencies = false;,但它不会像编写数据脚本那样为我提供所需的一切。
我还缺少什么其他设置?
private void GeneratingMainSQLScript(string schema)
{
Server srv = new Server(@".\sql2017");
Database dbs = srv.Databases["SOURCE_T"];
ScriptingOptions options = new ScriptingOptions();
options.TargetServerVersion = SqlServerVersion.Version140;
options.EnforceScriptingOptions = true;
options.ScriptData = true;
options.ScriptDrops = false;
options.FileName = GenerateScriptFileName(schema, false);
options.EnforceScriptingOptions = true;
options.ScriptSchema = true;
options.IncludeHeaders = true;
options.AppendToFile = true;
options.Indexes = true;
options.WithDependencies = true;
var tableNames = GetTableNames(schema);
int progressCounter = 1;
foreach (var tbl in tableNames)
{
if (tbl.SchemaName == "dbo" && tbl.TableName == "FileDatas")
{
options.ScriptData = false;
}
dbs.Tables[tbl.TableName, tbl.SchemaName].EnumScript(options);
DisplayDebug(string.Format("Running migration schema's ({2}) main genreated script | Total: {0} | Processing #: {1}", tableNames.Count, progressCounter, schema));
progressCounter++;
}
}
更新:
我在与主管合作后进行了这些更改,我们已经很接近了。现在的问题:它是在创建表之后生成 FKS,而不是像直接通过 SSMS 那样在文件的末尾生成?
Server srv = new Server(@".\sql2017");
Database dbs = srv.Databases["SOURCE_T"];
ScriptingOptions options = new ScriptingOptions();
options.FileName = GenerateScriptFileName(schema, isSchemaOnly);
options.EnforceScriptingOptions = true;
// start
options.AnsiPadding = false;
options.AppendToFile = true;
options.ContinueScriptingOnError = false;
options.ConvertUserDefinedDataTypesToBaseType = false;
options.WithDependencies = false;
options.IncludeHeaders = true;
options.IncludeScriptingParametersHeader = false;
options.SchemaQualify = true;
options.Bindings = false;
options.NoCollation = true;
options.Default = true;
options.ScriptDrops = false;
options.ScriptSchema = isSchemaOnly;
options.ExtendedProperties = true;
options.TargetServerVersion = SqlServerVersion.Version140;
options.TargetDatabaseEngineType = Microsoft.SqlServer.Management.Common.DatabaseEngineType.Standalone;
options.LoginSid = false;
options.Statistics = false;
options.ScriptData = !isSchemaOnly;
options.ChangeTracking = false;
options.DriAllConstraints = true;
options.ScriptDataCompression = false;
options.DriForeignKeys = true;
options.FullTextIndexes = false;
options.Indexes = false;
options.DriPrimaryKey = true;
options.Triggers = false;
options.DriUniqueKeys = true;
options.DriAll = true;
【问题讨论】:
-
将
EnumScript放入if?还是用continue;来拯救foreach? -
@Charlieface:嗯,就像在
EnumScript中,如果它有一个特定表的 FK,它正在生成依赖关系,然后如果该表再次与 FK 一起使用,它将再次生成它。 -
这能回答你的问题吗? How to set SMO ScriptingOptions to guarantee exact copy of table? 看起来你需要
DriAll = true和WithDependencies = false -
@Charlieface:Ugg,现在并非所有插入的脚本数据都不存在!但它不再生成重复数据。
-
@Charlieface:我更新了票,我们很接近了!我添加了一个 UPDATE,您能看看我缺少哪些选项会在脚本末尾而不是在每个表之后生成 FKS?
标签: c# sql-server smo