SSMS में स्क्रिप्ट निर्माण की तुलना में SqlPubwiz के पास बहुत सीमित विकल्प हैं। इसके विपरीत एसएमओ के पास उपलब्ध विकल्प एसएसएमएस से लगभग बिल्कुल मेल खाते हैं, यह सुझाव देते हुए कि यह शायद एक ही कोड है। (मुझे आशा है कि एमएस ने इसे दो बार नहीं लिखा है!) एमएसडीएन पर इस तरह के कई उदाहरण हैं जो अलग-अलग वस्तुओं के रूप में स्क्रिप्टिंग टेबल दिखाते हैं। हालांकि यदि आप चाहते हैं कि सब कुछ एक 'पूर्ण' स्कीमा के साथ सही ढंग से स्क्रिप्ट करे जिसमें 'डीआरआई' (घोषणात्मक संदर्भात्मक अखंडता) ऑब्जेक्ट्स जैसे विदेशी कुंजी शामिल हैं तो स्क्रिप्टिंग टेबल व्यक्तिगत रूप से निर्भरताओं को सही ढंग से काम नहीं करता है। मैंने पाया कि सभी यूआरएन एकत्र करना और उन्हें एक सरणी के रूप में स्क्रिप्टर को सौंपना आवश्यक है। यह कोड, उदाहरण से संशोधित, मेरे लिए काम करता है (हालांकि मुझे लगता है कि आप इसे साफ कर सकते हैं और इसे थोड़ा और टिप्पणी कर सकते हैं):
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Sdk.Sfc;
// etc...
// Connect to the local, default instance of SQL Server.
Server srv = new Server();
// Reference the database.
Database db = srv.Databases["YOURDBHERE"];
Scripter scrp = new Scripter(srv);
scrp.Options.ScriptDrops = false;
scrp.Options.WithDependencies = true;
scrp.Options.Indexes = true; // To include indexes
scrp.Options.DriAllConstraints = true; // to include referential constraints in the script
scrp.Options.Triggers = true;
scrp.Options.FullTextIndexes = true;
scrp.Options.NoCollation = false;
scrp.Options.Bindings = true;
scrp.Options.IncludeIfNotExists = false;
scrp.Options.ScriptBatchTerminator = true;
scrp.Options.ExtendedProperties = true;
scrp.PrefetchObjects = true; // some sources suggest this may speed things up
var urns = new List<Urn>();
// Iterate through the tables in database and script each one
foreach (Table tb in db.Tables)
{
// check if the table is not a system table
if (tb.IsSystemObject == false)
{
urns.Add(tb.Urn);
}
}
// Iterate through the views in database and script each one. Display the script.
foreach (View view in db.Views)
{
// check if the view is not a system object
if (view.IsSystemObject == false)
{
urns.Add(view.Urn);
}
}
// Iterate through the stored procedures in database and script each one. Display the script.
foreach (StoredProcedure sp in db.StoredProcedures)
{
// check if the procedure is not a system object
if (sp.IsSystemObject == false)
{
urns.Add(sp.Urn);
}
}
StringBuilder builder = new StringBuilder();
System.Collections.Specialized.StringCollection sc = scrp.Script(urns.ToArray());
foreach (string st in sc)
{
// It seems each string is a sensible batch, and putting GO after it makes it work in tools like SSMS.
// Wrapping each string in an 'exec' statement would work better if using SqlCommand to run the script.
builder.AppendLine(st);
builder.AppendLine("GO");
}
return builder.ToString();