将目录中的所有文件插入表(MS SQL)

时间:2015-03-23 11:07:43

标签: sql sql-server

我使用以下代码段插入单个文件。

INSERT INTO [dbo].[Files]
    (Data, Name)
    (SELECT *, 'test.test' FROM 
    OPENROWSET(BULK 'C:\temp\test.test', SINGLE_BLOB) as Data)  
GO

有没有办法对所有文件执行此操作并保留其文件名?像:

INSERT INTO [dbo].[Files]
    (Data, Name)
    (SELECT *, <FILENAME> FROM 
    OPENROWSET(BULK 'C:\temp\*.*', SINGLE_BLOB) as Data)        
GO

2 个答案:

答案 0 :(得分:1)

您可以使用SQLCMD生成并运行一个脚本,该脚本会为某些文件夹中的每个文件插入。

一些解释:

  

:r =运行指定的脚本

     

:!! = run dos batch命令

对于测试,您可能希望使用:r命令和删除big_script.sql的行删除最后一行。

创建一个包装insert语句的存储过程(这主要是为了使这个sqlcmd脚本更易于调试和读取)。 在与txt文件相同的文件夹中创建名为main.sql的文件。将以下内容添加到此脚本中。

我现在无权访问sql server机器,所以我无法测试它的特定版本。可能存在小错误,但整体想法应该有效。

main.sql:

:!! if exist big_script.sql del big_script.sql
:!! for %f in (*.test) do @(echo EXEC dbo.ImportFile @File = %f &echo.GO)>> big_script.sql
:r big_script.sql

:!! del big_script.sql

像这样运行:

sqlcmd -E -S REMOTESERVERNAME -d DATABASENAME -i main.sql 

答案 1 :(得分:-1)

您可以在SSIS中轻松完成。您必须使用For Each循环容器,然后可以使用Exec SQL任务在任何位置插入包含当前文件名的变量。

以下是使用SSIS处理多个文件的明确说明:

https://www.simple-talk.com/sql/ssis/ssis-basics-introducing-the-foreach-loop-container/

SSIS非常快,具有良好的日志记录,错误处理功能,一旦您适度使用它,就非常灵活。