Powershell和bcp工具实现带多组参数和标签的SQL Server数据库批量数据导出程序

server/2025/3/18 18:42:48/

设计一个基于多个带标签SQL模板作为配置文件和多组参数的Powershell代码程序和bcp工具,实现根据不同的输入参数,自动批量地将SQL Server数据库的数据导出为CSV文件到指定目录上,标签和多个参数(以“_”分割)为组成导出数据文件名,文件已经存在则覆盖原始文件。Powershell程序需要异常处理,输出带时间戳和每个运行批次和每个导出文件作业运行状态的日志文件,每天单独一个带日期的和.log扩展名日志文件,放在logs子目录中,参数全部设置在json配置文件中。

<#
.SYNOPSIS
SQL数据批量导出工具(基于bcp实用程序).DESCRIPTION
根据JSON配置自动生成CSV文件,支持多模板多参数组合,带完整日志和异常处理
#># 初始化配置
$configPath = "config.json"
$logDir = ".\logs"
$currentDate = Get-Date -Format "yyyyMMdd"
$logFile = Join-Path $logDir "$currentDate.log"# 创建日志目录
if (-not (Test-Path $logDir)) { New-Item -ItemType Directory -Path $logDir | Out-Null }# 日志记录函数
function Write-Log {param([string]$Message,[ValidateSet("INFO","ERROR","WARNING")][string]$Level = "INFO")$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"$logEntry = "[$timestamp] [$Level] $Message"Add-Content -Path $logFile -Value $logEntry
}# 异常处理函数
function Handle-Error {param([string]$Message,[string]$TemplateLabel,[string]$Parameters)Write-Log -Message "导出失败 [$TemplateLabel] 参数: $Parameters - $Message" -Level ERROR
}# 主处理函数
function Invoke-SqlExport {try {# 加载配置文件$config = Get-Content $configPath | ConvertFrom-Json$connectionString = "Server=$($config.Database.Server);Database=$($config.Database.DatabaseName);Trusted_Connection=$($config.Database.IntegratedSecurity);"Write-Log "========== 导出作业启动 =========="Write-Log "数据库服务器: $($config.Database.Server)"Write-Log "目标目录: $($config.ExportSettings.OutputDirectory)"# 遍历所有SQL模板foreach ($template in $config.SqlTemplates) {Write-Log "处理模板 [$($template.Label)]"# 读取SQL模板文件$sqlTemplate = Get-Content $template.TemplatePath -Raw# 处理每个参数组foreach ($paramGroup in $template.ParameterGroups) {$currentSQL = $sqlTemplate$fileNameParams = @()try {# 替换SQL参数foreach ($param in $paramGroup.Parameters.PSObject.Properties) {$currentSQL = $currentSQL -replace "\{\{$($param.Name)\}\}", $param.Value$fileNameParams += $param.Value}# 生成文件名$fileName = $template.Label + "_" + ($fileNameParams -join "_") + ".csv"$outputPath = Join-Path $config.ExportSettings.OutputDirectory $fileName# 构建bcp命令$bcpCommand = "bcp ""$currentSQL"" queryout ""$outputPath"" " +"-c -t$($config.ExportSettings.CsvDelimiter) " +"-S $($config.Database.Server) " +"-d $($config.Database.DatabaseName) "if ($config.Database.IntegratedSecurity -eq "True") {$bcpCommand += "-T"} else {$bcpCommand += "-U $($config.Database.Username) -P $($config.Database.Password)"}# 执行导出Write-Log "正在导出: $fileName"$result = Invoke-Expression $bcpCommand 2>&1if ($LASTEXITCODE -ne 0) {throw $result}Write-Log "成功导出: $fileName (文件大小: $(Get-Item $outputPath | Select-Object -ExpandProperty Length) bytes)"}catch {Handle-Error -Message $_.Exception.Message -TemplateLabel $template.Label -Parameters ($fileNameParams -join "_")}}}}catch {Write-Log "全局异常: $($_.Exception.Message)" -Level ERROR}finally {Write-Log "========== 导出作业完成 =========="}
}# 启动导出任务
Invoke-SqlExport

配置文件示例 (config.json):

{"Database": {"Server": "localhost","DatabaseName": "AdventureWorks","IntegratedSecurity": "True","Username": "","Password": ""},"ExportSettings": {"OutputDirectory": "D:\\DataExports","CsvDelimiter": ",","Encoding": "UTF8"},"SqlTemplates": [{"Label": "SalesData","TemplatePath": "templates\\sales_query.sql","ParameterGroups": [{"Parameters": {"Year": "2023","Region": "North"}},{"Parameters": {"Year": "2024","Region": "South"}}]},{"Label": "Inventory","TemplatePath": "templates\\inventory.sql","ParameterGroups": [{"Parameters": {"Category": "Electronics"}}]}]
}

SQL模板文件示例 (sales_query.sql):

sql">SELECT * FROM Sales.Orders 
WHERE OrderYear = {{Year}} 
AND RegionCode = '{{Region}}'

系统结构说明:

  1. 配置文件架构:

    • Database:数据库连接配置
    • ExportSettings:导出设置
    • SqlTemplates:模板数组,每个包含:
      • Label:文件前缀标签
      • TemplatePath:SQL模板文件路径
      • ParameterGroups:多个参数组配置
  2. 文件命名规则:

    • {标签}{参数1}{参数2}.csv
    • 示例:SalesData_2023_North.csv
  3. 日志系统特性:

    • 每日独立日志文件(YYYYMMDD.log)
    • 日志包含:
      • 时间戳(毫秒级)
      • 操作类型(INFO/ERROR)
      • 详细状态信息
      • 错误堆栈跟踪
  4. 异常处理机制:

    • 模板文件缺失处理
    • 数据库连接失败处理
    • BCP执行错误捕获
    • 文件系统权限错误处理
  5. 增强功能:

    • 自动创建缺失目录
    • 文件覆盖处理
    • 导出文件大小验证
    • BCP返回代码检查

使用说明:

  1. 保存PowerShell脚本为 Export-SqlData.ps1
  2. 创建config.json和SQL模板文件
  3. 运行命令:powershell -ExecutionPolicy Bypass -File Export-SqlData.ps1
  4. 查看日志文件:Get-Content .\logs\YYYYMMDD.log

注意事项:

  1. 确保bcp实用程序在系统PATH环境变量中
  2. SQL模板中的参数使用双花括号占位符({{param}})
  3. 需要PowerShell 5.1或更高版本
  4. 建议为数据库账号配置最小必要权限
  5. 大文件导出时增加查询超时设置(可在bcp命令添加-l参数)

http://www.ppmy.cn/server/176022.html

相关文章

信创环境下TOP5甘特图工具对比:从功能到适配性测评

在数字化转型的浪潮中&#xff0c;项目管理的高效与否直接决定了企业能否在激烈的市场竞争中脱颖而出。而甘特图作为项目管理中不可或缺的工具&#xff0c;其重要性不言而喻。尤其是在信创环境日益受到重视的当下&#xff0c;选择一款适配性强、功能完备的甘特图工具&#xff0…

贪心算法(7)(java) 分发饼干

题目&#xff1a;假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子i&#xff0c;都有一个胃口值g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j&#xff0c;都有一个尺寸 s[j…

C++:类对象的存储方式

如何计算类对象的大小 class A { public: void PrintA() { cout<<_a<<endl; } private: char _a; }; 类中既可以有成员变量&#xff0c;又可以有成员函数&#xff0c;那么一个类的对象中包含了什么&#xff1f;如何计算 一个类的大小&#xff1f; 类对象的存储方…

嵌入式/C++笔试面试指南(前言)

在数字化转型与智能硬件快速发展的时代&#xff0c;嵌入式系统与 C 语言作为支撑物联网、人工智能、工业控制等领域的核心技术&#xff0c;正面临着前所未有的人才需求。无论是初入职场的应届生&#xff0c;还是寻求技术突破的从业者&#xff0c;掌握嵌入式开发与 C 编程的核心…

谷粒商城:性能压测JVM堆区

目录 Kit Apache JMeter VisualVM 堆内存 jvm内存模型 垃圾回收&#xff08;Garbage Collection, GC&#xff09; 新对象分配内存 GC步骤 MinorGC 性能优化 影响因素 优化 nginx动静分离 优化三级分类获取 Jvm参数配置堆区 测试 Kit Apache JMeter 压力测试&…

如何处理PHP中的日期和时间问题

如何处理PHP中的日期和时间问题 在PHP开发中&#xff0c;日期和时间的处理是一个常见且重要的任务。无论是记录用户操作时间、生成时间戳&#xff0c;还是进行日期计算&#xff0c;PHP提供了丰富的函数和类来帮助开发者高效处理这些需求。本文将详细介绍如何在PHP中处理日期和…

关于deepseek R1模型分布式推理效率分析

1、引言 DeepSeek R1 采用了混合专家&#xff08;Mixture of Experts&#xff0c;MoE&#xff09;架构&#xff0c;包含多个专家子网络&#xff0c;并通过一个门控机制动态地激活最相关的专家来处理特定的任务 。DeepSeek R1 总共有 6710 亿个参数&#xff0c;但在每个前向传播…

每天一篇《目标检测》文献(三)

今天看的是《基于改进 YOLOv8 的被遮挡柑橘果实检测算法研究》。 目录 一、摘要 二、背景介绍 三、改进结构 四、空间定位算法 五、定位实验 一、摘要 为了获取柑橘果实的准确特征信息,实现被遮挡柑橘的准确识别和定位,达到精确采 摘的目的,提出了一种改进的被遮挡柑橘果…