示例#1
0
        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());
                }
            }
        }
示例#2
0
        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 + ")"
                ;
            }
        }
示例#4
0
 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]
     }
 }
示例#5
0
 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;
 }