Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用列的动态值大容量插入_Php_Sql Server_Database_Sql Server 2005_Bulkinsert - Fatal编程技术网

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

情况是这样的:

我有200个不同名称的txt文件,如601776.txt每个文件的名称实际上是一个ID\u foo,它包含如下数据(2列):

现在我想将这些TXT文件批量插入到一个SQL Server表中,该表有3列,其中一列应该是TXT文件的名称。我正在使用一个PHP脚本,所以我做了一个循环来获取文件名,然后呢

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脚本来更改文本文件,并在每行末尾添加文件名,然后将其批量插入数据库并解决了问题。顺便说一句,谢谢你,不过如果你能解释一下如何使用你的脚本并对其进行详细描述,那就太好了