我使用以下代码段插入单个文件。
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
答案 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非常快,具有良好的日志记录,错误处理功能,一旦您适度使用它,就非常灵活。