繁体   English   中英

将 KQL 查询使用的所有表名放入 C# 中的列表中

[英]Putting all table names that a KQL query uses into a List in C#

假设我有一个使用多个表来检索数据的 KQL 查询。 我需要在 C# 中编写一些代码,它将获取给定 KQL 查询使用的所有表,并将所有这些表名放入一个列表中。

简单地说:我需要分析每个 KQL 查询以了解它从哪些表中获取数据。

我已经尝试通过编写以下代码来做到这一点:

var query = "Table1 | project a ,b,c";
       var code = KustoCode.Parse(query);‏
var parseCode = code.Analyze();
Console.WriteLine(parseCode.ResultType.Display.ToString());

但这不会返回名,而是返回此查询使用的名,这不是我想要的。

如果您能帮我解决这个问题,我将不胜感激!

我不相信这是先验的,因为某些表名可以在查询时解析,并且某些查询(例如使用 find)可以涵盖直到查询时才枚举的所有/多个表。

如果您在 ADX 集群的 azure 门户视图中的“诊断设置”选项卡中打开表使用统计信息,您可以在事后不久找到此信息。 这会将详细信息输入到应用程序洞察资源中,该资源将显示使用了哪些表/范围。

这似乎可以解决问题(基于.show queryplan

using System.Data;
using Newtonsoft.Json.Linq;

string query = @".show queryplan <| search in (database('*').*) * | summarize count() by $table";
string cluster = "https://help.kusto.windows.net/Samples";

using (var client = Kusto.Data.Net.Client.KustoClientFactory.CreateCslQueryProvider($"{cluster};Fed=true"))
{
    using IDataReader reader = client.ExecuteQuery(query);

    reader.Read();
    reader.Read();
    string relop_tree = reader.GetString(2);
    JObject content = JObject.Parse(relop_tree);

    IEnumerable<JToken> sources = content.SelectTokens("$.source.operands..[?(@.source.type == 'TableShardReference')].source");

    foreach (JToken source in sources)
    {
        Console.WriteLine($"{source.Value<string>("database"), -50}{source.Value<string>("table")}");
    }
}

ContosoSales                                      SalesFact
ContosoSales                                      Products
ContosoSales                                      Customers
ContosoSales                                      SalesTable
KustoMonitoringPersistentDatabase                 KustoMonitoringTable
SampleIoTData                                     RawSensorsData
SampleIoTData                                     TransformedSensorsData
SampleIoTData                                     _MV_LatestSensorValue
SampleLogs                                        RawSysLogs
SampleLogs                                        TransformedSysLogs
SampleLogs                                        TraceLogs
SampleLogs                                        TargetTable
SampleMetrics                                     RawServerMetrics
SampleMetrics                                     TransformedServerMetrics
SampleMetrics                                     _MV_TransformedMetricsDedup
SampleMetrics                                     SQLServerLocation
SampleMetrics                                     _MV_AvgPerfWithServersHierarchy
Samples                                           StormEvents
Samples                                           demo_make_series1
Samples                                           demo_series2
Samples                                           demo_series3
Samples                                           demo_many_series1
Samples                                           ConferenceSessions
Samples                                           demo_make_series2
Samples                                           demo_clustering1
Samples                                           Covid19_Bing
Samples                                           Covid19_map2
Samples                                           US_States
Samples                                           US_Counties
Samples                                           irregular_ts
Samples                                           _MV_DailyCovid19
Samples                                           demo_prometheus
Samples                                           PopulationData
Samples                                           OccupancyDetection
Samples                                           SamplePowerRequirementHistorizedData

感谢您的帮助:我终于找到了解决方案,所以这是我的代码:

var code = KustoCode.Parse(query).Analyze();

SyntaxElement.WalkNodes(code.Syntax,
       Operator =>
       {
           if (Operator is Expression e && e.RawResultType is TableSymbol && Operator.Kind.ToString() == "NameReference")
               tables.Add(e.ToString());
       })

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM