private void Append(string tableName, Index index) { string unique = index.Unique ? "UNIQUE" : ""; string clustered = index.Clustered ? "CLUSTERED" : "NONCLUSTERED"; string dropExisting = index.DropExisting ? "DROP_EXISTING = ON" : "DROP_EXISTING = OFF"; string ignoreDupKey = index.IgnoreDupKey ? "IGNORE_DUP_KEY = ON" : "IGNORE_DUP_KEY = OFF"; string online = index.Online ? "ONLINE = ON" : "ONLINE = OFF"; string padIndex = index.Online ? "PAD_INDEX = ON" : "PAD_INDEX = OFF"; string sortInTempdb = index.SortInTempdb ? "SORT_IN_TEMPDB = ON" : "SORT_IN_TEMPDB = OFF"; string sProperties = string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0},\n{1},\n{2},\n{3},\n{4}", padIndex, sortInTempdb, dropExisting, ignoreDupKey, online); string kName; string keys = new KeysBuilder(index.Keys).Build(index.Name, out kName); TemplatePlatformEmitter te = new TemplatePlatformEmitter("CreateIndex", unique, clustered, kName, tableName, keys, sProperties, string.Empty); _stringBuilder.Append(te.Emit(index)); _stringBuilder.Append(NEWLINE); }
// TODO: Is this the right approach for events and precedence constraints? Should we have a utility method to handle them? // TODO: It would be good to find an approach to unify permissions and move some of this under the securables lowerer. public static void ProcessStoredProcedure(AstStoredProcNode storedProcNode) { var executeSqlNode = new AstExecuteSqlTaskNode(storedProcNode.ParentItem) { Name = storedProcNode.Name, ExecuteDuringDesignTime = storedProcNode.ExecuteDuringDesignTime, Connection = storedProcNode.Connection, ResultSet = ExecuteSqlResultSet.None }; executeSqlNode.Query = new AstExecuteSqlQueryNode(executeSqlNode) { QueryType = QueryType.Standard }; var queryBuilder = new StringBuilder(new StoredProcTSqlEmitter(storedProcNode).Emit()); foreach (var permission in storedProcNode.Permissions) { var template = new TemplatePlatformEmitter("CreateStoredProcedurePermission", permission.Action.ToString(), permission.Target.ToString(), storedProcNode.Name, permission.Principal.Name); queryBuilder.AppendLine(template.Emit()); } executeSqlNode.Query.Body = queryBuilder.ToString(); executeSqlNode.PrecedenceConstraints = storedProcNode.PrecedenceConstraints; if (executeSqlNode.PrecedenceConstraints != null) { executeSqlNode.PrecedenceConstraints.ParentItem = executeSqlNode; } foreach (var eventHandler in storedProcNode.Events) { executeSqlNode.Events.Add(eventHandler); eventHandler.ParentItem = executeSqlNode; } var parentContainer = storedProcNode.ParentItem as AstContainerTaskNode; if (parentContainer != null) { parentContainer.Tasks.Replace(storedProcNode, executeSqlNode); } }