public CreateViewStatement(Qualified<SchemaName, ViewName> viewName, Optional<Sequence<ColumnName>> columnNames, OptionToken viewOption, SelectStatement selectStatement, Optional<WithCheckOptionToken> withCheckOption) {
			Debug.Assert(viewName != null);
			Debug.Assert(selectStatement != null);
			this.viewName = viewName;
			this.viewOption = viewOption;
			this.columnNames = columnNames.ToList();
			this.selectStatement = selectStatement;
			this.withCheckOption = withCheckOption.HasValue();
		}
		public CreateProcedureStatement(Qualified<SchemaName, ProcedureName> procedureName, Optional<Sequence<ProcedureParameter>> parameters, OptionToken option, ReplicationToken replication, StatementBlock body) {
			Debug.Assert(procedureName != null);
			Debug.Assert(body != null);
			this.procedureName = procedureName;
			this.option = option;
			this.replication = replication;
			this.parameters = parameters.ToList();
			this.body = body;
		}
		public ExecuteStatement(VariableName resultVariableName, Qualified<SchemaName, ProcedureName> procedureName, Optional<Sequence<ExecuteParameter>> parameters, OptionToken option) {
			Debug.Assert(procedureName != null);
			this.resultVariableName = resultVariableName;
			this.procedureName = procedureName;
			this.parameters = parameters.ToList();
			this.option = option;
			if (!procedureName.IsQualified && procedureName.Name.Value.StartsWith("sp_", StringComparison.OrdinalIgnoreCase)) {
				procedureName.LockOverride();
				int[] parameterPositions;
				if (objectNameParameters.TryGetValue(procedureName.Name.Value, out parameterPositions)) {
					foreach (int parameterPosition in parameterPositions.Where(p => this.parameters.Count > p)) {
						ExecuteParameter<Literal> objectNameParameter = (ExecuteParameter<Literal>)this.parameters[parameterPosition];
						if ((objectNameParameter != null) && (objectNameParameter.Value is StringLiteral)) {
							this.parameters[parameterPosition] = new ExecuteParameterObjectName(objectNameParameter.ParameterName, ((StringLiteral)objectNameParameter.Value), objectNameParameter.Output);
						}
					}
				}
			}
		}
		protected CreateFunctionStatement(Qualified<SchemaName, FunctionName> functionName, Sequence<Parameter> parameters, OptionToken option) {
			Debug.Assert(functionName != null);
			this.functionName = functionName;
			this.parameters = parameters.ToList();
			this.option = option;
		}
		public ExecuteStatement(Qualified<SchemaName, ProcedureName> procedureName, Optional<Sequence<ExecuteParameter>> parameters, OptionToken option): this(null, procedureName, parameters, option) {}
		public TopExpression(Expression expression, Optional<PercentToken> percent, OptionToken option) {
			this.expression = expression;
			this.percent = percent.HasValue();
			withTies = option is OptionTiesToken;
		}