SQL Server批量查询外部数据
需求:基于一个外部列表(如 CSV/TXT 文件中的 3000 多行数据)来过滤数据库中的记录。
方案:使用 VALUES 构造器 + JOIN (更高效的纯 SQL 替代)
SQL Server 2008 引入了 VALUES 构造器,您可以利用它来构建一个“即时表”,然后与目标表 JOIN。这比 WHERE IN 具有更好的性能和可读性,并且不需要任何对象创建权限。
1. 在本地准备数据
您需要将 3000 个值转换成逗号分隔的行列表:
示例格式:
SQL
2. 在 SSMS中执行
将数据结构粘贴到 FROM (VALUES ...) 构造器中:
SQL
💡 性能说明 (推荐)
-
性能: 这种方法允许 SQL Server 优化器将
VALUES构造器视为一个小的、内存中的表,并使用高效的JOIN算法(如 Hash Match 或 Merge Join)来执行查询。这通常比超长的WHERE IN列表要高效得多。
以下Python代码将读取TXT 文件,并将其内容转换为一个可以直接粘贴到 SSMS 中的长字符串。
注意: txt文件格式为ANSI,否则python转换程序会报错

def format_data_for_sqlserver_values(input_filename, output_filename=None):
"""
读取TXT文件中的数据(每行一个值),并格式化为SQL Server VALUES构造器所需的格式:
('value1'), ('value2'), ('value3'), ...
:param input_filename: 输入的 TXT 文件路径。
:param output_filename: 可选,如果指定,结果将写入该文件,否则将打印到控制台。
"""
# 最终的格式化数据列表
formatted_values = []
try:
with open(input_filename, 'r', encoding='utf-8') as f:
# 逐行读取文件
for line in f:
# 1. 移除行首和行尾的空白字符(包括换行符)
value = line.strip()
# 2. 忽略空行
if not value:
continue
# 3. 格式化为 ('value') 的形式
# 注意:SQL Server 字符串需要用单引号 ' 包裹
formatted_item = f"('{value}')"
formatted_values.append(formatted_item)
except FileNotFoundError:
print(f"错误:找不到输入文件 {input_filename}")
return
# 将所有格式化后的值用逗号和空格连接起来
result_string = ",\n".join(formatted_values)
if output_filename:
# 如果指定了输出文件,则写入文件
try:
with open(output_filename, 'w', encoding='utf-8') as outfile:
outfile.write(result_string)
print(f"\n✅ 成功将 {len(formatted_values)} 条记录格式化并保存到文件:{output_filename}")
except Exception as e:
print(f"写入文件时出错: {e}")
else:
# 否则打印到控制台,便于直接复制
print("\n--- 格式化结果 (请直接复制以下内容) ---")
print(result_string)
print("---------------------------------------")
print(f"总共格式化了 {len(formatted_values)} 条记录。")
# --- 使用示例 ---
if __name__ == "__main__":
# 假设您的数据文件名为 data_list.txt
INPUT_FILE_NAME = "poloInput.txt"
# 您可以选择将结果写入另一个文件,或设置为 None 直接打印到控制台
OUTPUT_FILE_NAME = "poloOutput.txt"
format_data_for_sqlserver_values(INPUT_FILE_NAME, OUTPUT_FILE_NAME)
浙公网安备 33010602011771号