Если вы используете .NET, вы можете использовать объекты управления сервером:
var so = new ScriptingOptions();
so.Triggers = true;
so.DriForeignKeys = true;
so.DriDefaults = true;
so.DriAllConstraints = true;
so.DriAllKeys = true;
so.DriIndexes = true;
so.DriUniqueKeys = true;
so.DriPrimaryKey = true;
so.Indexes = true;
so.Default = true;
so.ClusteredIndexes = true;
so.IncludeDatabaseContext = true;
so.TargetServerVersion = SqlServerVersion.Version90;
var server = new Server("ServerName");
var db = server.Databases["DatabaseName"];
var stringColl = db.Tables["Table"].Script(so);
Вам потребуется заменить имена таблицы и связанных объектов (например, FK_OldTableName_xxx на FK_NewTableName_xxx) в сгенерированном сценарии:
var sb = new StringBuilder();
foreach(var s in stringColl)
{
var r = s.Replace("OldTableName", "NewTableName");
sb.AppendLine(r);
}
А затем выполнить:
db.Execute(sb.ToString());
Обратите внимание, что это довольно наивный код: он будет работать только в том случае, если имена ваших ограничений и ключей соответствуют формату: FK_OldTableName_xxx / CK_OldTableName_xxx .. если у них есть другие имена, вам нужно увеличить код замены строки, возможно, с помощью регулярных выражений для поиска шаблонов создания объектов T-SQL (например, CREATE INDEX, FOREIGN KEY и т. д.).