Php 如何使用列的动态值大容量插入
情况是这样的: 我有200个不同名称的txt文件,如601776.txt每个文件的名称实际上是一个ID\u foo,它包含如下数据(2列): 现在我想将这些TXT文件批量插入到一个SQL Server表中,该表有3列,其中一列应该是TXT文件的名称。我正在使用一个PHP脚本,所以我做了一个循环来获取文件名,然后呢Php 如何使用列的动态值大容量插入,php,sql-server,database,sql-server-2005,bulkinsert,Php,Sql Server,Database,Sql Server 2005,Bulkinsert,情况是这样的: 我有200个不同名称的txt文件,如601776.txt每个文件的名称实际上是一个ID\u foo,它包含如下数据(2列): 现在我想将这些TXT文件批量插入到一个SQL Server表中,该表有3列,其中一列应该是TXT文件的名称。我正在使用一个PHP脚本,所以我做了一个循环来获取文件名,然后呢 BULK INSERT Employee_Table FROM '../home/601776.txt' WITH ( FIELDTERMIN
BULK INSERT Employee_Table
FROM '../home/601776.txt'
WITH (
FIELDTERMINATOR ='\t',
ROWTERMINATOR = ''\n''
)
在每个循环中使用$file\u name变量大容量插入时,如何设置第三列
如果可以通过逐行读取txt文件来插入表,您认为这是一个更好的主意吗?怎么做
谢谢这是SQL Server中为数不多的几次真正理想的游标。有个办法。一旦您看到PRINT语句并感到满意,就可以对它进行注释并取消注释它下面的两行。我加入了一些逻辑来添加文件名和通常需要的处理日期,但是您的表定义需要这些列。它应该能让人明白这个想法
---------------------------------------------------------------------------------------------------------------
--Set some variables
---------------------------------------------------------------------------------------------------------------
DECLARE @dt VARCHAR(10) --date variable but stored as VARCHAR for formatting of file name
DECLARE @fileLocation VARCHAR(128) = 'E:\DATA_TRANSFERS\' --production location which is \\issqlstd01 but the xp_dirtree didn't like this
DECLARE @sql NVARCHAR(4000) --dynamic sql variable
DECLARE @fileName VARCHAR(128) --full file name variable
---------------------------------------------------------------------------------------------------------------
--Get a list of all the file names in the directory
---------------------------------------------------------------------------------------------------------------
IF OBJECT_ID('tempdb..#FileNames') IS NOT NULL DROP TABLE #FileNames
CREATE TABLE #FileNames (
id int IDENTITY(1,1)
,subdirectory nvarchar(512)
,depth int
,isfile bit)
INSERT #FileNames (subdirectory,depth,isfile)
EXEC xp_dirtree @fileLocation, 1, 1
---------------------------------------------------------------------------------------------------------------
--Create a cursor to fetch the file names
---------------------------------------------------------------------------------------------------------------
DECLARE c CURSOR FOR
select subdirectory from #FileNames where isfile = 1
OPEN c
FETCH NEXT FROM c INTO @fileName
---------------------------------------------------------------------------------------------------------------
--For each file, bulk insert
---------------------------------------------------------------------------------------------------------------
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'BULK INSERT Employee_Table FROM '''+ @fileLocation + @fileName +''' WITH (FIELDTERMINATOR = ''\t'',KEEPNULLS,ROWTERMINATOR = ''0x0a'')'
--Try the bulk insert, if error is thrown log the error
--Also update the Table Columns which aren't a part of the original file (load date and original file name)
BEGIN TRY
PRINT(@sql)
--EXEC(@sql)
--UPDATE Employee_Table SET OrigFile = @fileName, LoadDate = GETDATE() WHERE OrigFile IS NULL
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
END CATCH
FETCH NEXT FROM c INTO @fileName
END
CLOSE c
DEALLOCATE c
GO
这是SQL Server中为数不多的几次真正理想的游标。有个办法。一旦您看到PRINT语句并感到满意,就可以对它进行注释并取消注释它下面的两行。我加入了一些逻辑来添加文件名和通常需要的处理日期,但是您的表定义需要这些列。它应该能让人明白这个想法
---------------------------------------------------------------------------------------------------------------
--Set some variables
---------------------------------------------------------------------------------------------------------------
DECLARE @dt VARCHAR(10) --date variable but stored as VARCHAR for formatting of file name
DECLARE @fileLocation VARCHAR(128) = 'E:\DATA_TRANSFERS\' --production location which is \\issqlstd01 but the xp_dirtree didn't like this
DECLARE @sql NVARCHAR(4000) --dynamic sql variable
DECLARE @fileName VARCHAR(128) --full file name variable
---------------------------------------------------------------------------------------------------------------
--Get a list of all the file names in the directory
---------------------------------------------------------------------------------------------------------------
IF OBJECT_ID('tempdb..#FileNames') IS NOT NULL DROP TABLE #FileNames
CREATE TABLE #FileNames (
id int IDENTITY(1,1)
,subdirectory nvarchar(512)
,depth int
,isfile bit)
INSERT #FileNames (subdirectory,depth,isfile)
EXEC xp_dirtree @fileLocation, 1, 1
---------------------------------------------------------------------------------------------------------------
--Create a cursor to fetch the file names
---------------------------------------------------------------------------------------------------------------
DECLARE c CURSOR FOR
select subdirectory from #FileNames where isfile = 1
OPEN c
FETCH NEXT FROM c INTO @fileName
---------------------------------------------------------------------------------------------------------------
--For each file, bulk insert
---------------------------------------------------------------------------------------------------------------
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'BULK INSERT Employee_Table FROM '''+ @fileLocation + @fileName +''' WITH (FIELDTERMINATOR = ''\t'',KEEPNULLS,ROWTERMINATOR = ''0x0a'')'
--Try the bulk insert, if error is thrown log the error
--Also update the Table Columns which aren't a part of the original file (load date and original file name)
BEGIN TRY
PRINT(@sql)
--EXEC(@sql)
--UPDATE Employee_Table SET OrigFile = @fileName, LoadDate = GETDATE() WHERE OrigFile IS NULL
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
END CATCH
FETCH NEXT FROM c INTO @fileName
END
CLOSE c
DEALLOCATE c
GO
当我在C#中完成类似的工作时,我编写了一个方法进入文件并将所需的数据添加到CSV中。Bulk_Insert(据我所知,如果我错了,请纠正我)非常愚蠢,因为它只是拾取文件并插入,您不能真正干预。因此,为了省去麻烦,我在批量插入之前获得了我需要的文件。@Leonidas199x这也是一个很好的选择,但我想知道是否有一种方法可以直接使用批量插入。因此,您希望有一个第三列的文件名,并对
n
多个文件执行批量插入。。。基本上都在我怀疑的目录中?@scsimonexactly@scsimon我不是数据库脚本方面的专家,所以我制作了一个php脚本来更改文本文件,并在每行末尾添加文件名,然后将其批量插入数据库并解决了问题。顺便说一句,谢谢你,但是如果你能解释一下如何使用你的脚本,并对它进行更多的描述,那就太好了。当我在C#中完成类似的工作时,我已经编写了一个方法,可以进入文件并将我需要的数据添加到CSV中。Bulk_Insert(据我所知,如果我错了,请纠正我)非常愚蠢,因为它只是拾取文件并插入,您不能真正干预。因此,为了省去麻烦,我在批量插入之前获得了我需要的文件。@Leonidas199x这也是一个很好的选择,但我想知道是否有一种方法可以直接使用批量插入。因此,您希望有一个第三列的文件名,并对n
多个文件执行批量插入。。。基本上都在我怀疑的目录中?@scsimonexactly@scsimon我不是数据库脚本方面的专家,所以我制作了一个php脚本来更改文本文件,并在每行末尾添加文件名,然后将其批量插入数据库并解决了问题。顺便说一句,谢谢你,不过如果你能解释一下如何使用你的脚本并对其进行详细描述,那就太好了