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

如何通过CSV文件在Aspentech Infoplus 21中批量查询多标签数据?

解决AspenTech Infoplus 21多TAG查询问题

你的问题出在多TAG的SQL语法构造错误:单TAG时用NAME='%s'没问题,但从CSV读取的多TAG是一个Series,直接拼到SQL里会生成无效语法,导致查询失败。以下是修正方案:

核心思路

多TAG查询需要用SQL的IN子句,格式为NAME IN ('TAG1', 'TAG2', 'TAG3'),而不是单个NAME='TAG'。同时建议在查询结果中保留NAME列,方便区分不同TAG的数据。

修正后的代码

方法1:字符串拼接(适合可控的CSV数据源)

import pandas as pd
import pyodbc
from datetime import datetime, timedelta

# 连接IP21数据库
conn = pyodbc.connect("DRIVER={AspenTech SQLplus};HOST=192.xxx.x.xxx;PORT=10014")

# 读取CSV中的TAG列表,过滤空值
tags = pd.read_csv("C:\\Users\\xxx\\TAGcsvIN.csv", decimal=',', sep=';', parse_dates=True)
tag_list = tags['TAGcsv'].dropna().tolist()  # 去掉可能的空TAG

# 构造时间范围
end = datetime.now()
start = end - timedelta(days=2)
end_str = end.strftime("%Y-%m-%d %H:%M:%S")
start_str = start.strftime("%Y-%m-%d %H:%M:%S")

# 构造多TAG的SQL语句
tag_str = "', '".join(tag_list)  # 把TAG转为'TAG1', 'TAG2'格式
sql = f"""
SELECT NAME, TS, VALUE FROM HISTORY 
WHERE NAME IN ('{tag_str}')
  AND PERIOD = 300*10
  AND REQUEST = 2
  AND TS BETWEEN TIMESTAMP'{start_str}' AND TIMESTAMP'{end_str}'
"""

# 执行查询
data = pd.read_sql(sql, conn)

方法2:参数化查询(更安全,避免SQL注入)

如果CSV中的TAG可能包含特殊字符,建议用参数化查询:

import pandas as pd
import pyodbc
from datetime import datetime, timedelta

conn = pyodbc.connect("DRIVER={AspenTech SQLplus};HOST=192.xxx.x.xxx;PORT=10014")
tags = pd.read_csv("C:\\Users\\xxx\\TAGcsvIN.csv", decimal=',', sep=';', parse_dates=True)
tag_list = tags['TAGcsv'].dropna().tolist()

end = datetime.now()
start = end - timedelta(days=2)
end_str = end.strftime("%Y-%m-%d %H:%M:%S")
start_str = start.strftime("%Y-%m-%d %H:%M:%S")

# 构造参数占位符,每个TAG对应一个?
placeholders = ', '.join(['?'] * len(tag_list))
sql = f"""
SELECT NAME, TS, VALUE FROM HISTORY 
WHERE NAME IN ({placeholders})
  AND PERIOD = 300*10
  AND REQUEST = 2
  AND TS BETWEEN TIMESTAMP? AND TIMESTAMP?
"""

# 传入参数:TAG列表 + 开始/结束时间
data = pd.read_sql(sql, conn, params=[*tag_list, start_str, end_str])

关键说明

  1. 去掉了原SQL中重复的REQUEST=2条件,简化语法。
  2. 添加NAME字段到查询结果,方便后续区分不同TAG的时序数据。
  3. 用dropna()过滤CSV中可能存在的空TAG,避免无效查询。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 05:40:42