You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Data Studio扩展能否获取查询结果集及相关信息?

获取Azure Data Studio已执行查询的结果集数据

要实现不重新执行查询就能获取结果集的列架构和样本行,你可以利用Azure Data Studio内置的IQueryService API监听查询完成事件,提前捕获并存储结果数据,后续触发操作时直接调用这些缓存的数据。

具体实现步骤

  1. 获取查询服务实例
    在扩展激活时,通过依赖注入获取IQueryService——这是Azure Data Studio提供的用于处理查询生命周期的核心服务:

    import { IQueryService } from 'sql/platform/query/common/queryService';
    import { IExtensionContext } from 'vscode';
    
    let queryService: IQueryService;
    let latestQueryResult: {
        providerId: string;
        queryText: string;
        columns: Array<{ name: string; dataType: string; isNullable: boolean }>;
        sampleRows: any[];
    } | null = null;
    
    export function activate(context: IExtensionContext) {
        queryService = context.getService<IQueryService>('IQueryService');
        // 注册查询完成监听和操作命令
        setupQueryListener();
        registerProcessCommand(context);
    }
    
  2. 监听查询完成事件
    注册onQueryCompleted事件回调,在用户执行完查询后,提取结果集的列元数据和最多5行样本数据,并关联对应的连接类型与查询语句:

    function setupQueryListener() {
        queryService.onQueryCompleted(event => {
            // 跳过无结果返回的查询
            if (!event.batchResults || event.batchResults.length === 0) return;
    
            const firstBatch = event.batchResults[0];
            if (!firstBatch.resultSets || firstBatch.resultSets.length === 0) return;
    
            const targetResultSet = firstBatch.resultSets[0];
            const connection = event.connectionProfile;
    
            // 提取列信息:名称、数据类型、是否可为空
            const columns = targetResultSet.columns.map(col => ({
                name: col.columnName,
                dataType: col.dataType,
                isNullable: col.isNullable ?? false
            }));
    
            // 截取最多5行样本数据
            const sampleRows = targetResultSet.rows.slice(0, 5);
    
            // 缓存结果供后续操作使用
            latestQueryResult = {
                providerId: connection?.providerId || '',
                queryText: event.queryText || '',
                columns,
                sampleRows
            };
        });
    }
    
  3. 注册用户触发的操作命令
    创建命令面板或按钮触发的命令,直接调用缓存的结果数据执行你的业务逻辑:

    import { commands, window } from 'vscode';
    
    function registerProcessCommand(context: IExtensionContext) {
        const disposable = commands.registerCommand('your-extension-id.process-query-result', () => {
            if (!latestQueryResult) {
                window.showWarningMessage('未找到已执行的查询结果,请先运行SQL查询');
                return;
            }
    
            // 此处替换为你的业务逻辑实现
            console.log('连接类型:', latestQueryResult.providerId);
            console.log('查询语句:', latestQueryResult.queryText);
            console.log('列架构:', latestQueryResult.columns);
            console.log('样本数据:', latestQueryResult.sampleRows);
        });
    
        context.subscriptions.push(disposable);
    }
    

关键注意事项

  • 多结果集适配:如果需要支持多结果集场景,可以修改逻辑遍历firstBatch.resultSets,或添加用户选择结果集的交互环节。
  • 连接有效性校验:可添加connection非空判断,避免空引用错误。
  • 扩展配置:在package.json中声明激活事件(如onCommand:your-extension-id.process-query-result),确保扩展能正确加载并获取查询服务。
  • 缓存时效控制:若需跨会话保留数据,可使用context.globalState存储,但需注意样本数据的大小限制。

这种方案完全基于官方稳定API,无需重新执行查询,不会影响用户体验,是当前最可靠的实现方式。

内容的提问来源于stack exchange,提问作者Chris Wood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:03:25