我正在使用SSIS 2008并尝试使用包来将指定文件导入为其布局创建的表中。它将接收目的地表&源文件作为包变量。
我遇到的主要问题是文件布局可能会发生变化,但它们并不一致。我要导入的表格将匹配该文件。我初步成功,但在更改源文件/目标后不久就会抛出vs_needsnewmetadata错误。
是否发现了任何可能在此处使用的解决方案,以确定不适合包设计的布局的文件?
编辑:这些是.txt文件,以制表符分隔。 Edit2:尝试摆弄OPENROWSET,在我们的服务器上遇到安全错误。
答案 0 :(得分:1)
我在这里假设所述文件是CSV文件。
几周前我刚刚面临同样的问题。您需要使用动态SQL来实现此目的。
使用以下代码在数据库上创建存储过程(将2" C:\ Folder \"位置更改为文件位置):
CREATE PROCEDURE [dbo].[CreateAndImportCSVs] (@FILENAME NVARCHAR(200))
AS
BEGIN
SET NOCOUNT ON;
DECLARE @PATH NVARCHAR(4000) = N'C:\Folder\' + @FILENAME + ''
DECLARE @TABLE NVARCHAR(50) = SUBSTRING(@FILENAME,0,CHARINDEX('.',@FILENAME))
DECLARE @SQL NVARCHAR(4000) = N'IF OBJECT_ID(''dbo.' + @TABLE + ''' , ''U'') IS NOT NULL DROP TABLE dbo.[' + @TABLE + ']
SELECT * INTO [' + @TABLE + ']
FROM OPENROWSET(''MSDASQL''
,''Driver={Microsoft Access Text Driver (*.txt, *.csv)};DefaultDir=C:\Folder;''
,''SELECT * FROM ' + @FILENAME + ''')'
EXEC(@SQL)
END
您可能需要从以下位置下载Microsoft Access数据库引擎: https://www.microsoft.com/en-gb/download/details.aspx?id=13255 并安装在您的计算机/服务器上以使Microsoft Access Text Driver正常工作。
然后在SSIS中创建一个执行SQL任务,其中包含与SQL Server数据库相关的连接详细信息。然后将文件名传递给您创建的存储过程:
EXEC dbo.CreateAndImportCSVs 'filename.csv'
然后,它将根据CSV中包含的结构和数据创建表,它还将表命名为与csv文件名相同。
*此存储过程也可用于运行文件列表。
希望这有帮助!