使用php批量加载到azure

使用php批量加载到azure,php,sql-server,azure,sqlsrv,Php,Sql Server,Azure,Sqlsrv,我正在尝试使用PHP将CSV加载到Azure Web服务器数据库。CSV各有2000行。我有它的工作,但当我在网页上运行该文件时,数据库只更新了479个条目,我不知道为什么。该网页需要很长的时间来处理,然后它会显示网页说,它已完成。以下是我对insert语句的理解 try { $connection = new PDO("sqlsrv:server = tcp:".$SrvName.",1433; Database = ".$DBName, $SQ

我正在尝试使用PHP将CSV加载到Azure Web服务器数据库。CSV各有2000行。我有它的工作,但当我在网页上运行该文件时,数据库只更新了479个条目,我不知道为什么。该网页需要很长的时间来处理,然后它会显示网页说,它已完成。以下是我对insert语句的理解

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();
}
试试看{
$connection=new-PDO(“sqlsrv:server=tcp:“..$SrvName.”,1433;Database=“..$DBName,$SQL\u USER,$SQL\u PASS”);
if($handle=fopen(“personal.csv”,“r”)!==FALSE){
while(($data=fgetcsv($handle,1000,“,”)!==FALSE){
$num=计数($data);
$sql=“插入个人(clientId、lastname、ssn)
值($data[0]、$data[1]、$data[2])”;
$statement=$connection->prepare($sql);
$statement->execute();
}
fclose($handle);
}
}捕获(异常$error){
echo$sql。“
”$error->getMessage(); }

非常感谢您的帮助

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

解决方案1
:Microsoft PHP for SQL Server驱动程序利用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存储过程实例


但不要直接将批量插入到实际表中

  • 我总是将CSV文件中的ext.customer\u staging(不带标识列)插入到staging表中
  • 可能编辑/清理/操作导入的数据
  • 然后使用T-SQL语句将数据复制到实际表中,如下所示:
插入ext.customer\u Staging with(TABLOCK)(客户、年龄、性别)
从OPENROWSET中选择*(
批量“bs140513_032310-demo.csv”,
数据源='MyDataSource',
格式='CSV',
FORMATFILE_DATA_SOURCE='MyDataSource'
)作为数据文件;
去
插入ext.customer(名称、地址)
选择客户、年龄、性别
从ext.customer\u Staging

Web页面通常有一个最大上载大小—您检查过了吗。插入数据RBAR(一行一行)就像首字母缩略词所暗示的那样,是非常痛苦的。您已经将.csv文件假脱机到了PHP服务器上的磁盘上,因此为什么不使用专门用于在单个操作中执行大容量插入的方法呢?我们还可以使用大容量插入将数据从本地和Azure中的csv文件插入Azure sql表。如本文所述。没有尝试过实际的批量插入,这在azure web应用程序上是否真的有效?@John Iacoucci我认为理论上可以实现。非常感谢我现在已经成功了!