使用php批量加载到azure
我正在尝试使用PHP将CSV加载到Azure Web服务器数据库。CSV各有2000行。我有它的工作,但当我在网页上运行该文件时,数据库只更新了479个条目,我不知道为什么。该网页需要很长的时间来处理,然后它会显示网页说,它已完成。以下是我对insert语句的理解使用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
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我认为理论上可以实现。非常感谢我现在已经成功了!