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

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

完整解决方案:

注意事项

  1. 确保BTEQ客户端已正确安装并配置环境变量
  2. 数据库密码以明文存储,生产环境建议使用加密方式
  3. SQL模板中的参数占位符必须与参数组数量严格匹配
  4. 建议在测试环境验证SQL模板和参数组合的正确性

文件结构

├── config.json
├── Export-TeradataData.ps1
├── templates/
│   └── sales.sql
├── logs/
│   └── 20231015.log
└── exports/├── SalesReport_2023_Q4.csv└── SalesReport_2023_Q3.csv

config.json

{"database": {"host": "teradata.server.com","username": "myuser","password": "mypassword"},"templates": [{"label": "SalesReport","path": "templates/sales.sql","parameters": [["2023", "Q4"],["2023", "Q3"]]}],"export_directory": "exports","log_directory": "logs"
}

templates/sales.sql

SELECT * FROM Sales
WHERE Year = {{0}}AND Quarter = {{1}};

Export-TeradataData.ps1

<#
.SYNOPSIS
Automated Teradata data export tool using BTEQ.DESCRIPTION
This script executes parameterized SQL templates against Teradata and exports results to CSV files.
#>param([Parameter(Mandatory=$true)][string]$ConfigPath = "config.json"
)# 初始化配置
$config = Get-Content $ConfigPath -Raw | ConvertFrom-Json# 创建必要目录
New-Item -ItemType Directory -Path $config.export_directory -Force | Out-Null
New-Item -ItemType Directory -Path $config.log_directory -Force | Out-Null# 初始化日志
$logDate = Get-Date -Format "yyyyMMdd"
$logFile = Join-Path $config.log_directory "$logDate.log"function Write-Log {param([string]$Message,[string]$Level = "INFO")$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"$logEntry = "[$timestamp][$Level] $Message"Add-Content -Path $logFile -Value $logEntry
}Write-Log "=== Script Start ==="# 主处理逻辑
try {foreach ($template in $config.templates) {$label = $template.label$templatePath = $template.pathtry {$sqlTemplate = Get-Content $templatePath -Raw -ErrorAction StopWrite-Log "Loaded template: $label"} catch {Write-Log "Error loading template [$label]: $_" -Level "ERROR"continue}foreach ($paramGroup in $template.parameters) {$batchId = [guid]::NewGuid().ToString().Substring(0,8)$paramString = $paramGroup -join "_"$exportFile = "${label}_${paramString}.csv"$exportPath = Join-Path $config.export_directory $exportFile# 参数替换$sqlQuery = $sqlTemplatefor ($i=0; $i -lt $paramGroup.Count; $i++) {$sqlQuery = $sqlQuery -replace "\{\{$i\}\}", $paramGroup[$i]}# 生成BTEQ脚本$btqScript = @"
.LOGON $($config.database.host)/$($config.database.username),$($config.database.password)
.set separator ','
.set titledashes off
.set format off
.EXPORT REPORT FILE=$exportPath
;
$sqlQuery
;
.IF ERRORCODE <> 0 THEN .QUIT ERRORCODE
.EXPORT RESET
.LOGOFF
.QUIT 0
"@$btqScriptPath = [System.IO.Path]::GetTempFileName()Set-Content -Path $btqScriptPath -Value $btqScript# 执行导出try {Write-Log "[$batchId] Starting export: $exportFile"if (Test-Path $exportPath) {Remove-Item $exportPath -ForceWrite-Log "[$batchId] Removed existing file: $exportFile"}$output = & bteq < $btqScriptPath 2>&1 | Out-Stringif ($LASTEXITCODE -ne 0) {throw "BTEQ Error ($LASTEXITCODE): $output"}Write-Log "[$batchId] Successfully exported: $exportFile"} catch {Write-Log "[$batchId] Export failed: $_" -Level "ERROR"} finally {Remove-Item $btqScriptPath -ErrorAction SilentlyContinue}}}
} catch {Write-Log "Fatal error: $_" -Level "CRITICAL"
} finally {Write-Log "=== Script End ==="
}

使用说明

  1. 配置文件:按实际环境修改config.json中的数据库连接信息和模板配置
  2. SQL模板:在templates目录中创建.sql文件,使用{{0}}、{{1}}等占位符
  3. 执行脚本
.\Export-TeradataData.ps1 -ConfigPath .\config.json

功能特性

  1. 自动化导出:根据配置文件自动处理所有模板和参数组合
  2. 文件管理:自动覆盖已存在文件,自动创建输出目录
  3. 日志记录
    • 每天生成独立的日志文件(logs/yyyyMMdd.log)
    • 包含详细的时间戳和操作状态
    • 支持多级日志级别(INFO/ERROR/CRITICAL)
  4. 异常处理
    • 模板加载错误
    • BTEQ执行错误
    • 文件操作错误
  5. 参数化配置:支持通过JSON配置灵活管理数据库连接、模板和参数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/896700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF 118A.String Task(Java实现)

题目分析 输入一个字符串&#xff0c;遍历每一个字符&#xff0c;如果是元音字母就删除&#xff0c;辅音字母就在其前面增加一个.&#xff0c;且所有字母输出都是小写。 思路分析 将输入的字符串改为字符数组&#xff0c;考虑到任意位置插入的情况&#xff0c;所以主要选择Lin…

LLM进阶

prologue&#xff1a;最近大模型火出天际&#xff0c;I’m definitely aware I’m late to the party&#xff0c;2022年毕业之后就很少在系统的跟踪一个domain了&#xff0c;所以这次下定决心要跟踪一下大模型的技术细节和实现过程&#xff0c;不做AI丁真 本文三条主线&#…

Ubuntu 下查看进程 PID 和终止进程方法

查看进程 PID 使用 ps 命令: ps aux | grep <process_name>例如&#xff0c;查看名为 python 的进程&#xff1a; ps aux | grep python使用 pgrep 命令: pgrep <process_name>例如&#xff0c;查看名为 python 的进程&#xff1a; pgrep python使用 top 命令: top…

Java基础语法练习34(抽象类-abstract)(抽象类最佳实践-模版设计模式)

一抽象类-abstract、 父类方法不确定性的问题故将该方法设计为抽象类&#xff08;没有实现的方法&#xff09;&#xff0c;但一般来说被子类继承然后实现 细节&#xff1a; 1、抽象类不可以被实例化 2、抽象类可以不包含抽象方法而且可以有实现的其他非抽象方法 3、abstra…

Android SDK与NDK的区别

Android SDK&#xff08;Software Development Kit&#xff09;与NDK&#xff08;Native Development Kit&#xff09;在Android应用开发中各自扮演着重要角色&#xff0c;它们之间存在显著的区别。以下是Android SDK与NDK的主要区别&#xff1a; 一、定义与用途 Android SDK…

DeepSeek在PiscTrace上完成个性化处理需求案例——光流法将烟雾动态可视化

引言&#xff1a;PiscTrace作为开放式的视图分析平台提供了固定格式的类型参数支持个性化定制处理需求&#xff0c;本文一步步的实现光流分析按照不同需求根据DeepSeek的代码处理视频生成数据。 光流法&#xff08;Optical Flow&#xff09;是一种基于图像序列的计算机视觉技术…

Linux网络 TCP全连接队列与tcpdump抓包

TCP全连接队列 在 Linux 网络中&#xff0c;TCP 全连接队列&#xff08;也称为 Accept 队列&#xff09;是一个重要的概念&#xff0c;用于管理已经完成三次握手&#xff0c;即已经处于 established 状态但尚未被应用程序通过 accept( ) 函数处理的 TCP 连接&#xff0c;避免因…

flex布局自定义一行几栏,靠左对齐===grid布局

模板 <div class"content"><div class"item">1222</div><div class"item">1222</div><div class"item">1222</div><div class"item">1222</div><div class"…

使用3090显卡部署Wan2.1生成视频

layout: post title: 使用3090显卡部署Wan2.1生成视频 catalog: true tag: [Kubernetes, GPU, AI] 使用3090显卡部署Wan2.1生成视频 1. 环境说明2. 模型下载3. 克隆仓库4. 安装依赖5. 生成视频 5.1. 使用generate脚本生成5.2. 使用gradio启动UI界面生成 5.2.1. 启动gradio服务5…

Prompt生成-Prompt工程师

# Role:Prompt工程师 ## Attention&#xff1a; - 我总是被老板骂写不出来Prompt&#xff0c;如果你能写出优秀的Prompt会避免让我失业&#xff0c;请认真思考并竭尽全力&#xff0c;拜托了&#xff01; ## Profile: - Author:pp - Version:2.1 - Language:中文 - Description:…

数据存储:一文掌握RabbitMQ的详细使用

文章目录 一、RabbitMQ简介二、RabbitMQ的概述2.1 基本概念2.2 实际应用场景三、RabbitMQ的安装与配置3.1 安装RabbitMQ3.2 启用管理插件四、使用Python操作RabbitMQ4.1 安装Pika库4.2 生产者示例4.3 消费者示例4.4 发布/订阅模式示例五、RabbitMQ的高级特性5.1 消息持久化5.2 …

Mixture of Experts与Meta Learning深度学习中的两大变革性技术

1. 引言 随着人工智能&#xff08;AI&#xff09;和深度学习技术的迅猛发展&#xff0c;创新的架构和算法不断涌现&#xff0c;推动了智能系统性能的显著提升。在这些技术中&#xff0c;Mixture of Experts (MoE) 和 Meta Learning Algorithms (MLA) 是两种极具影响力的方法。…

【新立电子】探索AI眼镜背后的黑科技,FPC如何赋能实时翻译与语音识别,点击了解未来沟通的新方式!

在全球化的今天&#xff0c;语言障碍成为人们沟通与交流的一大难题。AI眼镜作为一种新兴的智能设备&#xff0c;正在通过实时翻译与语音识别功能&#xff0c;打破语言壁垒&#xff0c;为人们提供无缝沟通的解决方案。FPC在AI眼镜中的应用&#xff0c;为实时翻译与语音识别功能的…

(十 三)趣学设计模式 之 模版方法模式!

目录 一、 啥是模板方法模式&#xff1f;二、 为什么要用模板方法模式&#xff1f;三、 模板方法模式的实现方式四、 模板方法模式的优缺点五、 模板方法模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&a…

模型和数据集的平台之在Hugging Face上进行模型下载、上传以及创建专属Space

模型下载 步骤&#xff1a; 注册Hugging Face平台 https://huggingface.co/ 新建一个hf_download_josn.py 文件 touch hf_download_josn.py 编写hf_download_josn.py文件 import os from huggingface_hub import hf_hub_download# 指定模型标识符 repo_id "inter…

【弹性计算】弹性裸金属服务器和神龙虚拟化(二):适用场景

弹性裸金属服务器和神龙虚拟化&#xff08;二&#xff09;&#xff1a;适用场景 1.混合云和第三方虚拟化软件部署2.高隔离容器部署3.高质量计算服务4.高速低时延 RDMA 网络支持场景5.RISC CPU 支持6.GPU 性能无损输出 公共云服务提供商推出 弹性裸金属服务器&#xff0c;很显然…

python容器之常用操作

以列表list为例&#xff0c;这个list相当于c中的数组或vector容器。那列表有哪些常用的操作呢&#xff1f; 获取列表的长度 list [1,2,3,4,5] //获取列表的长度 length len(list) 注意这里与c不同&#xff0c;c中的容器都是有各自的定义&#xff0c;每种容器类型都实现了自…

工程化与框架系列(11)--Serverless实践

Serverless实践 ☁️ Serverless&#xff08;无服务器&#xff09;架构是云计算的一种新范式&#xff0c;它让开发者专注于业务逻辑而无需关心服务器运维。本文将详细介绍前端开发中的Serverless实践方案。 Serverless概述 &#x1f31f; &#x1f4a1; 小知识&#xff1a;Se…

kan与小波,和不知所云的画图

文章目录 小波应用范围与pde小波的名字 画图图(a)&#xff1a;数值解向量 \( u \)图(b)&#xff1a;数值解向量 \( v \)结论图4 小波 在你提供的代码中&#xff0c;小波变换&#xff08;Wavelet Transform&#xff09;被用于 KANLinear 类中。具体来说&#xff0c;小波变换在 …

算法-二叉树篇22-二叉搜索树的最近公共祖先

二叉搜索树的最近公共祖先 力扣题目链接 题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且…