Jonvy

导航

SQL Server批量查询外部数据

需求:基于一个外部列表(如 CSV/TXT 文件中的 3000 多行数据)来过滤数据库中的记录。

 

方案:使用 VALUES 构造器 + JOIN (更高效的纯 SQL 替代)

SQL Server 2008 引入了 VALUES 构造器,您可以利用它来构建一个“即时表”,然后与目标表 JOIN。这比 WHERE IN 具有更好的性能和可读性,并且不需要任何对象创建权限

1. 在本地准备数据

您需要将 3000 个值转换成逗号分隔的行列表:

示例格式:

SQL
 
('value1'), ('value2'), ('value3'), ..., ('value3000')

 

2. 在 SSMS中执行

将数据结构粘贴到 FROM (VALUES ...) 构造器中:

SQL
 
SELECT
    t1.*
FROM
    t_stocpf t1
INNER JOIN
    (
        VALUES 
        ('643457700BL0031110UPGV'), 
        ('643457700BL0031110UPGU'), 
        ('643457700BL0031110UPGT'),         
        ('643457700BL0031110UPGS')
    ) AS t2(sto_cpf_cli_param) 
    ON t1.stocpf_no_cli = t2.sto_cpf_cli_param;

  

💡 性能说明 (推荐)

  • 性能: 这种方法允许 SQL Server 优化器将 VALUES 构造器视为一个小的、内存中的表,并使用高效的 JOIN 算法(如 Hash Match 或 Merge Join)来执行查询。这通常比超长的 WHERE IN 列表要高效得多

以下Python代码将读取TXT 文件,并将其内容转换为一个可以直接粘贴到 SSMS 中的长字符串。

注意: txt文件格式为ANSI,否则python转换程序会报错

image

 

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)

  

 

posted on 2025-12-03 11:38  不亮  阅读(0)  评论(0)    收藏  举报