public static void LoadViewOutputColumns(ISchemaMetadataProvider schemaMetadata, string ddl, Action <OutputColumnDescriptor> collector) { TSqlFragment sqlF = ScriptDomFacade.Parse(ddl); //CreateViewStatement stmt_CreateView = (CreateViewStatement)((TSqlScript)sqlF).Batches[0].Statements[0]; SelectStatement stmt_sel = (SelectStatement)((TSqlScript)sqlF).Batches[0].Statements[0]; BatchOutputColumnTypeResolver batchResolver = new BatchOutputColumnTypeResolver(schemaMetadata, stmt_sel, new BatchWithoutParameters()); StatementOutputColumnTypeResolverV2 resolver = new StatementOutputColumnTypeResolverV2(batchResolver, stmt_sel); QuerySpecification first = TopQuerySpecification(stmt_sel.QueryExpression); foreach (SelectElement se in first.SelectElements) { if (se is SelectScalarExpression scalarExpr) { OutputColumnDescriptor col = resolver.ResolveSelectScalarExpression(scalarExpr); collector(col); } else { throw new NotImplementedException(se.WhatIsThis()); } } }
public static void LoadFunctionOutputColumns(ISchemaMetadataProvider schemaMetadata, IBatchParameterMetadata parameterMetadata, string functionBodyScript, Action <OutputColumnDescriptor> collector) { functionBodyScript = RemoveTrailingBlockComment(functionBodyScript); if (functionBodyScript.Trim()[0] == '(') { int idx = functionBodyScript.IndexOf('('); int lastix = functionBodyScript.LastIndexOf(')'); functionBodyScript = functionBodyScript.Substring(idx + 1, lastix - idx - 2); functionBodyScript = functionBodyScript.Trim(); } TSqlFragment sqlF = ScriptDomFacade.Parse(functionBodyScript); SelectStatement stmt_sel = (SelectStatement)((TSqlScript)sqlF).Batches[0].Statements[0]; BatchOutputColumnTypeResolver batchResolver = new BatchOutputColumnTypeResolver(schemaMetadata, sqlF, parameterMetadata); StatementOutputColumnTypeResolverV2 resolver = new StatementOutputColumnTypeResolverV2(batchResolver, stmt_sel); QuerySpecification first = TopQuerySpecification(stmt_sel.QueryExpression); foreach (SelectElement se in first.SelectElements) { if (se is SelectScalarExpression scalarExpr) { OutputColumnDescriptor col = resolver.ResolveSelectScalarExpression(scalarExpr); collector(col); } else { throw new NotImplementedException(se.WhatIsThis()); } } }
internal ProcedureOutputColumn(TSqlFragment origin, OutputColumnDescriptor columnDbType) { this.origin = origin; this.columnDescriptor = columnDbType; if (columnDbType == null) { // put breakpoint here DebuggerText = "???"; } else { DebuggerText = (columnDbType.OutputColumnName != null ? columnDbType.OutputColumnName : null) + " " + (columnDbType.SourceColumnName != null ? "(" + columnDbType.SourceColumnName + ")" : null) //+ " : (" + columnDbType.ColumnDbType + ")" ; } }
public override void ExplicitVisit(ColumnReferenceExpression node) { if (hasSetVariable) { outputSet.Clear(); } else { //Console.WriteLine("Resolve type for reference:" + node.AsText()); OutputColumnDescriptor columnDbType = resolveColumnType ? columnTypeResolver.ResolveColumnReference(node) : null; if (columnDbType == null) { // put breakpoint here and try again //Console.WriteLine("Type resolve failed for reference:" + node.AsText()); } outputSet.AddColumn(new ProcedureOutputColumn(node, columnDbType)); // ColumnReferenceExpression : [a].[attributeid] } }
public override void ExplicitVisit(SelectScalarExpression node) { // IIF(@limitreached = 1, 1, 0) if (hasSetVariable) { outputSet.Clear(); } else { //Console.WriteLine("Resolve type for scalar:" + node.AsText()); OutputColumnDescriptor columnDbType = resolveColumnType ? columnTypeResolver.ResolveSelectScalarExpression(node) : null; if (columnDbType == null || columnDbType.ColumnType == null) { // put a breakpoint here //this column cannot be resolved from this query. if this is a part of a IF statemt try ELSE branch. } outputSet.AddColumn(new ProcedureOutputColumn(node, columnDbType)); // SelectScalarExpression } }
internal void ApplyMissingInformation(ProcedureOutputColumn procedureOutputColumn) { columnDescriptor = procedureOutputColumn.columnDescriptor; }