<p>更新:</p>
<p>pandas 0.23.1恢复了0.23.0中引入的有问题的更改。但是,对于原始性能的最佳解决方案仍然是CSV->;<code>bcp</code>方法,如下所述。在</p>
<p>更新:</p>
<p>熊猫0.24.0显然重新引入了这个问题(参考文献:<a href="https://stackoverflow.com/a/51988820/2144390">here</a>)</p>
<hr/>
<p><em>(原始答案)</em></p>
<p>在pandas版本0.23.0之前,<code>to_sql</code>将为DataTable中的每一行生成一个单独的INSERT:</p>
<pre class="lang-sql prettyprint-override"><code>exec sp_prepexec @p1 output,N'@P1 int,@P2 nvarchar(6)',
N'INSERT INTO df_to_sql_test (id, txt) VALUES (@P1, @P2)',
0,N'row000'
exec sp_prepexec @p1 output,N'@P1 int,@P2 nvarchar(6)',
N'INSERT INTO df_to_sql_test (id, txt) VALUES (@P1, @P2)',
1,N'row001'
exec sp_prepexec @p1 output,N'@P1 int,@P2 nvarchar(6)',
N'INSERT INTO df_to_sql_test (id, txt) VALUES (@P1, @P2)',
2,N'row002'
</code></pre>
<p>大概是为了提高性能,pandas 0.23.0现在生成一个表值构造函数,以便在每次调用中插入多行</p>
^{pr2}$
<p>问题是SQLServer存储过程(包括系统存储过程,如<code>sp_prepexec</code>)被限制为2100个参数,因此,如果DataFrame有100列,<code>to_sql</code>一次只能插入大约20行。在</p>
<p>我们可以使用</p>
<pre class="lang-python prettyprint-override"><code># df is an existing DataFrame
#
# limit based on sp_prepexec parameter count
tsql_chunksize = 2097 // len(df.columns)
# cap at 1000 (limit for number of rows inserted by table-value constructor)
tsql_chunksize = 1000 if tsql_chunksize > 1000 else tsql_chunksize
#
df.to_sql('tablename', engine, if_exists='replace', index=False, chunksize=tsql_chunksize)
</code></pre>
<p>然而,最快的方法仍然可能是:</p>
<ul>
<li><p>将数据帧转储到CSV文件(或类似文件),然后</p></li>
<li><p>让Python调用sqlserver<code>bcp</code>实用程序将该文件上载到表中。</p></li>
</ul>