如何将SQL Server查询结果按‘列名=数据’格式导出至扁平文件
实现SQL Server数据导出为指定键值对格式的扁平文件
方法一:直接修改SQL查询生成目标格式
修改原有查询,通过CROSS APPLY将每条记录的字段转换为单独行,并拼接成要求的键值对格式:
SELECT CONCAT(col_name, ' = ', col_value, CASE WHEN col_name != 'TransactionNumber' THEN ',' ELSE '' END) AS output_line FROM [DB].[dbo].[Message] CROSS APPLY ( VALUES ('Description', CAST([Description] AS VARCHAR(MAX))), ('MessageDescription', CAST([MessageDescription] AS VARCHAR(MAX))), ('CardNumber', CAST([CardNumber] AS VARCHAR(MAX))), ('TimeStamp_Server', CONVERT(VARCHAR(10), [TimeStamp_Server], 120)), -- 按示例截取日期部分 ('CardHolderID', CAST([SPMDescription] AS VARCHAR(MAX))), ('FirstName', CAST([FirstName] AS VARCHAR(MAX))), ('MiddleName', CAST([MiddleName] AS VARCHAR(MAX))), ('LastName', CAST([LastName] AS VARCHAR(MAX))), ('CardStatusID', CAST([CardStatusID] AS VARCHAR(MAX))), ('CardStatusDescription', CAST([CardStatusDescription] AS VARCHAR(MAX))), ('Imprint', CAST([Imprint] AS VARCHAR(MAX))), ('TransactionNumber', CAST([TransactionNumber] AS VARCHAR(MAX))) ) AS cols(col_name, col_value) WHERE CONVERT(varchar(10), TimeStamp_Server, 120) = CONVERT(varchar(10), GETDATE(), 120)
执行该查询后,直接将结果导出为文本文件即可,每行对应一个键值对条目。
方法二:用PowerShell处理已有CSV文件
如果已经导出了标准CSV文件,可通过PowerShell脚本将其转换为目标格式:
# 替换为你的输入CSV路径和输出文本路径 $inputPath = "C:\export\original_data.csv" $outputPath = "C:\export\formatted_data.txt" $csvData = Import-Csv -Path $inputPath foreach ($row in $csvData) { $properties = $row.PSObject.Properties foreach ($index in 0..($properties.Count-1)) { $prop = $properties[$index] $value = if ([string]::IsNullOrEmpty($prop.Value)) { "" } else { $prop.Value } if ($index -eq $properties.Count-1) { Write-Output "$($prop.Name) = $value" } else { Write-Output "$($prop.Name) = $value," } } Write-Output "" # 每条记录间加空行分隔,可按需删除 } | Out-File -Path $outputPath -Encoding UTF8
方法三:通过SSIS实现自动化转换
如果需要定期自动化导出,可使用SQL Server Integration Services(SSIS):
- 创建数据流任务,从SQL Server源读取数据;
- 添加脚本组件(转换类型),在脚本中遍历每条记录的字段,生成对应的键值对行;
- 将脚本组件的输出连接到平面文件目标,完成导出。
内容的提问来源于stack exchange,提问作者JoeMarvel
相关产品推荐
相关产品推荐

