从4000多个具有相应名称的文件批量插入4000多个表

时间:2015-01-14 16:01:55

标签: sql sql-server bulkinsert

我有一个包含4000多个管道分隔文件的文件夹,其名称与模式中的表名相同。

我正在尝试这样做

DECLARE @tableName varchar(max)
DECLARE @sqlCommand varchar(max)
DECLARE @path varchar(20)
SET @path =  'x:\xfer\'

DECLARE tNames CURSOR
FOR
    SELECT table_name FROM information_schema.tables
    WHERE TABLE_TYPE='BASE TABLE'
    AND TABLE_NAME = 'sales_time_pd'
    ORDER BY TABLE_NAME

OPEN tNames
    FETCH  FROM tNames
        INTO @tableName

        WHILE @@FETCH_STATUS = 0
            BEGIN

               SET @sqlCommand = 'BULK INSERT @tableName
               FROM @path + @tableName
               WITH 
                  (
                     FIELDTERMINATOR ='' |'',
                     ROWTERMINATOR ='' |\n''
                  );'

                EXEC(@sqlCommand)


                FETCH NEXT FROM tNames
                into @tableName
            END
CLOSE tNames;   
DEALLOCATE tNames;

我正在寻找这个概念,请原谅我对撇号的错误使用

作为测试,我定位单个文件/表来执行批量插入。我了解到表名必须是静态的。

那么如何从具有相应名称的文件目录中批量插入表的集合?

1 个答案:

答案 0 :(得分:1)

您看起来像是在错误地连接SQL字符串尝试类似:

SET @sqlCommand = 'BULK INSERT '+@tableName+' FROM '''+@path + @tableName+''' 

如果您在标签中使用特殊字符;您也可以尝试使用:

SET @sqlCommand = 'BULK INSERT ['+@tableName+'] FROM '''+@path + @tableName+''' 

您可以通过将EXEC(@sqlCommand)替换为print @sqlCommand来验证您是否正确连接了sql命令。获取打印的命令并尝试运行它,如果出现错误,请接收消息并查看其含义并尝试修复语法。

通过动态构建SQL字符串,您可以获取@Variable表名,并使其成为连接到命令中的静态文字。