使用 php 批量加载到 Azure

bulk load to azure using php

我正在尝试使用 PHP 将 CSV 加载到 Azure 网络服务器数据库。 CSV 文件各有 2000 行。我让它工作,但是当我 运行 网页上的文件时,数据库只更新了 479 个条目,我不确定为什么。该网页需要很长时间才能处理,然后它会显示页面说它已完成。这是我的插入语句。

try {
    $connection = new PDO("sqlsrv:server = tcp:".$SrvName.",1433; Database = ".$DBName, $SQL_USER, $SQL_PASS);
    if (($handle = fopen("personal.csv", "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            $num = count($data);
            $sql = "INSERT INTO personal (clientId, lastname, ssn)
                    VALUES ($data[0], $data[1],$data[2])";
            $statement = $connection->prepare($sql);
            $statement->execute();
        }
        fclose($handle);
    }

} catch(PDOException $error) {
    echo $sql . "<br>" . $error->getMessage();
}

非常感谢任何帮助!

我认为我们有两个解决方案:

解决方案1
How to: Send Data as a Stream:用于 SQL 服务器的 PHP 的 Microsoft 驱动程序利用 PHP 流向服务器发送大型对象。

解决方案2
设计一个存储过程,将文件名作为参数传递。
示例代码:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[spBulkInsert]  @FileName varchar(255)
AS
declare @sql varchar(max)
BEGIN Try
set @sql =  
'INSERT into  ext.customer_Staging with (TABLOCK) (customer, age, gender)
   SELECT * FROM OPENROWSET(
   BULK '+ @FileName + ',
   DATA_SOURCE = ''MyDataSource'',
   FORMAT = ''CSV'',
   FORMATFILE_DATA_SOURCE = ''MyDataSource''
   ) AS DataFile;
   go'

 exec(@sql)
END TRY 

BEGIN CATCH
    PRINT ERROR_MESSAGE()
END CATCH

GO

然后使用php调用这个sqlserver存储过程实例


但不要 BULK INSERT 直接插入到您真正的 table 中。

  • 我总是从 CSV 文件 table ext.customer_Staging(没有 IDENTITY 列)中插入
  • 可能编辑/清理/操作您导入的数据
  • 然后使用 T-SQL 语句将数据复制到真实的 table,例如:
INSERT into  ext.customer_Staging with (TABLOCK) (customer, age, gender)
   SELECT * FROM OPENROWSET(
   BULK 'bs140513_032310-demo.csv',
   DATA_SOURCE = 'MyDataSource',
   FORMAT = 'CSV',
   FORMATFILE_DATA_SOURCE = 'MyDataSource'
   ) AS DataFile;
   go

INSERT INTO ext.customer(Name, Address) 
   SELECT customer, age, gender
   FROM ext.customer_Staging