使用 pymssql 将文本文件批量插入 SQL Server

Posted

技术标签:

【中文标题】使用 pymssql 将文本文件批量插入 SQL Server【英文标题】:Bulk Insert text file into SQL Server using pymssql 【发布时间】:2018-06-21 23:17:23 【问题描述】:

我正在尝试使用 pymssql 将文本文件导入 SQL Server 2014(我是 python 的初学者,但如果您了解一点 SQL,这似乎是最简单的方法)。 SQL Server 与我要导入的文件位于同一台机器上。

这是我当前的代码

SQLCon = pymssql.connect(host=ServerNm,database=DatabaseNm)
Cursor = SQLCon.cursor()

BulkInsert = '''
    BULK INSERT OD_List
    FROM 
    WITH (
        FIRSTROW=2
      , FIELDTERMINATOR=','
      , ROWTERMINATOR='\n'
    )
'''.format("'C:\Users\thomsog1\Desktop\TM Tool\Test\SQL\Inputs\OD_List.txt'")

Cursor.execute(BulkInsert)
SQLCon.commit()

我在互联网上找到了一些编码示例并尝试了它们都无济于事......我一直以以下错误结束:

File "pymssql.pyx", line 467, in pymssql.Cursor.execute (pymssql.c:7561)      
pymssql.OperationalError: (4861, 'Cannot bulk load because the file 
"C:\\Users\thomsog1\\Desktop\\TM Tool\\Test\\SQL\\Inputs\\OD_List.txt" could 
not be opened. Operating system error code 123(The filename, directory name, 
or volume label syntax is incorrect.).DB-Lib error message 20018, severity 
16:\nGeneral SQL Server error: Check messages from the SQL Server\n') 

任何帮助将不胜感激!

【问题讨论】:

BULK INSERT error code 3: The system cannot find the path specified的可能重复 另外,字符串中的反斜杠可能会导致问题。尝试使用像 r'C:\Users\ ...' 这样的原始字符串 感谢您的回复。我确实看到了这个问题,但是 SQL Server 与我要导入的文件位于同一台机器上,所以我认为它不相关。抱歉,我之前没有说清楚,我已经相应地编辑了问题。 我已经尝试过 .format("r'C:\Users\thomsog1\Desktop\TM Tool\Test\SQL\Inputs\OD_List.txt'") 和 .format(r'C: \Users\thomsog1\Desktop\TM Tool\Test\SQL\Inputs\OD_List.txt')。他们给出“无效的对象名称”错误。 试试.format(r"'C:\Users\thomsog1\Desktop\TM Tool\Test\SQL\Inputs\OD_List.txt'") 【参考方案1】:

对于 T-SQL,BULK INSERT 语句的 FROM 子句中的文件路径需要用单引号括起来,但它还包含反斜杠,因此我们需要使用 Python 原始字符串 (r"..."),因此

.format(r"'C:\Users\thomsog1\Desktop\TM Tool\Test\SQL\Inputs\OD_List.txt'")

【讨论】:

以上是关于使用 pymssql 将文本文件批量插入 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

如何修复使用 pymssql 插入 sql DB 的错误

使用 python pymssql 将二进制文件插入 MSSQL db (varbinary)

尝试将数据表批量插入 SQL Server 时出现 InvalidOperationException

python中pymssql如何向sql server插入数据 插入的值可以用变量替换

pymssql INSERT 不会自动增加 ID

如何在列表pymssql中循环插入值?