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

PowerShell导出数据库表为CSV格式异常求助

问题:Azure VM执行SQL查询后无法生成正确CSV格式输出

问题现象

通过Invoke-AzVMRunCommand在Azure虚拟机上执行SQL查询,期望导出行列结构的CSV文件,但当前仅得到键值对形式的纯文本字符串;尝试用Export-CSV处理时,仅输出length字段,无法得到预期的表格型CSV。

当前脚本代码

$scriptCode = @'
$query = "use test_MO; 
SELECT Quantity, 'License Metric', 'Product Name', 'Manufacturer (Article)', 'Manufacturer article number (Article)','Article description (Article)','Purchase requisition number','Order number','License status','Maintenance end date'
FROM licenses lic
"

$sql_job = Invoke-Sqlcmd  -ServerInstance $servername -Query "$Query"
$sql_job
'@

Remove-Item -Path "sqllicensereport.ps1" -Force
New-Item -Path . -Name "sqllicensereport.ps1" -ItemType "file" -Value "$scriptCode"  | out-null
$runquery = Invoke-AzVMRunCommand -ResourceGroupName $ServerRGName  -VMName $ServerName -CommandId 'RunPowerShellScript' -ScriptPath "sqllicensereport.ps1" -Parameter @{servername = $servername}
$temp = $runquery.Value[0].Message | Format-Table -Auto > $outputFile

问题原因

  1. 虚拟机内的脚本直接输出$sql_job对象,Invoke-AzVMRunCommand会将其转换为纯文本字符串返回,本地无法拿到原始对象,导致Export-CSV只能处理字符串的length属性。
  2. 使用Format-Table处理纯文本,输出的是格式化后的文本,并非标准CSV结构。

解决方案

方案1:在虚拟机内直接生成CSV(推荐)

修改虚拟机内的脚本,将SQL查询结果直接转换为CSV字符串输出,本地直接保存即可:

$scriptCode = @'
$query = @"
use test_MO; 
SELECT Quantity, [License Metric], [Product Name], [Manufacturer (Article)], [Manufacturer article number (Article)],
       [Article description (Article)], [Purchase requisition number], [Order number], [License status], [Maintenance end date]
FROM licenses lic
"@

# 执行SQL查询并转换为CSV格式(去掉类型信息)
$sql_job = Invoke-Sqlcmd -ServerInstance $servername -Query $Query
$sql_job | ConvertTo-Csv -NoTypeInformation
'@

Remove-Item -Path "sqllicensereport.ps1" -Force
New-Item -Path . -Name "sqllicensereport.ps1" -ItemType "file" -Value $scriptCode | Out-Null
$runquery = Invoke-AzVMRunCommand -ResourceGroupName $ServerRGName -VMName $ServerName -CommandId 'RunPowerShellScript' -ScriptPath "sqllicensereport.ps1" -Parameter @{servername = $servername}

# 将VM返回的CSV文本直接写入文件
$runquery.Value[0].Message | Out-File $outputFile -Encoding utf8

说明:

  • SQL查询中带空格/特殊字符的列名用[]包裹,避免语法错误。
  • ConvertTo-Csv -NoTypeInformation直接将查询对象转换为标准CSV字符串,返回后本地无需额外处理。

方案2:本地解析纯文本生成CSV(无法修改VM脚本时使用)

如果无法调整虚拟机内的脚本,可在本地解析返回的纯文本,转换为对象后导出CSV:

# 获取VM返回的原始文本
$rawOutput = $runquery.Value[0].Message

# 分割文本为单个记录块(以Quantity开头分割)
$recordBlocks = $rawOutput -split '(?m)^[\s]+Quantity\s+:' | Where-Object { $_ -ne '' }

# 解析每个记录块为对象
$results = foreach ($block in $recordBlocks) {
    $props = [ordered]@{}
    # 处理第一个缺失Quantity开头的记录块
    if (-not $block.StartsWith('Quantity')) {
        $firstLine = $block -split ':', 2 | ForEach-Object { $_.Trim() }
        $props['License Metric'] = $firstLine[1]
        $remainingLines = $block -split "`n" | Select-Object -Skip 1
    } else {
        $remainingLines = $block -split "`n"
    }
    # 逐行解析键值对
    foreach ($line in $remainingLines) {
        if ($line -match '^\s*(.+?)\s*:\s*(.*)$') {
            $props[$matches[1].Trim()] = $matches[2].Trim()
        }
    }
    [PSCustomObject]$props
}

# 导出为标准CSV
$results | Export-Csv -Path $outputFile -NoTypeInformation -Encoding utf8

说明:

  • 通过正则分割和匹配解析纯文本中的键值对,转换为PowerShell对象后,即可用Export-Csv生成正确的CSV。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:24:50