【问题标题】:PHP sqlsrv BULK INSERT incompletePHP sqlsrv 批量插入不完整
【发布时间】:2020-06-04 15:51:16
【问题描述】:

我正在尝试通过 SQL 服务器 BULK INSERT 功能插入一个大文件(几百万行)。我的 SQL 查询将如下所示:

 BULK INSERT MY_TABLE
 FROM '\\myserver\open\myfile.csv'
 WITH (
 firstrow=2,
 FIELDTERMINATOR = ',',
 ROWTERMINATOR = '\n',
 BATCHSIZE = 50000,
 ERRORFILE = '\\myserver\open\myfileerror.log' 
 );

当我从 MSSQL Server Management Studio 触发它时,它总是完全导入它。 当我从我的 PHP 代码中执行此操作时,有时它会在中间停止,没有任何错误消息。

我尝试使用 sqlsrv_query 或 sqlsrv_prepare/sqlsrv_execute,结果相同。

sql; //like the query above
$statement = sqlsrv_query($connection, $sql);
if($statement === false) {
    $error = sqlsrv_errors();
    $error['sql'] = $sql;
    throw new Exception(json_encode($error));
}

是否可以从 $statement 中获取 MSSQL 的日志,就像从 MSSQL Studio 中获取的一样?例如(50000 行受影响)。

作为一种解决方法,我已将 BATCHSIZE 增加到 1000000,但这不是真正的解决方案。

背景资料: - PHP 7.1.9 - sqlsrv 版本:4.3.0+9904 - sqlsrv.ClientBufferMaxKBSize:10240 - Windows 2012 R2 服务器

【问题讨论】:

  • 如何连接SQL Server(如何执行sqlsrv_query())?
  • 我不确定您的问题是否正确。要连接到 MSSQL,我使用本地帐户(而不是 Active Directory)。在我的代码中,我使用命令 sqlsrv_connect(database_url_name,$params) 在 $param 中,我有:['CharacterSet'=>"UTF-8",'ReturnDatesAsStrings'=>true]。否则,我使用 Windows Windows 2012 R2 服务器,并从以下位置安装 MSSQL 驱动程序:docs.microsoft.com/en-us/sql/connect/php/…
  • 谢谢,我想知道您如何连接到 SQL Server - 使用 windows 或 sql 身份验证。但看起来,你真正的问题是插入没有完全执行并且没有错误。我在类似的问题上发布了answer,请尝试将SET NOCOUNT ON 作为您声明的第一行。

标签: php sql-server bulk-load


【解决方案1】:

问题在于语句缓冲区。当我用 sqlsrv_next_result 读取它时,处理继续。

$statement = sqlsrv_query($connection, $sql);
if($statement === false) {
    $error = sqlsrv_errors();
    $error['sql'] = $sql;
    throw new Exception(json_encode($error));
} else if($statement) {
    while($next_result = sqlsrv_next_result($statement)){
        #echo date("Y-m-d H:i:s",time()). " Reading buffer...\n";
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2016-07-11
    相关资源
    最近更新 更多