我需要每天从网上提供的csv执行dataload,例如http://www.supplier.com/products.csv 一旦我将csv转储到sql表中,我就可以进行处理,然后需要更新/插入等。问题是我不知道如何自动化dataload。
我希望我可以使用SQL作业/任务,计划每天06:00运行,给它一个uri,然后它可以访问csv中的数据......
我该怎么做?
答案 0 :(得分:5)
您可以安排SQL代理作业在本地下载文件并使用BULK INSERT:
CREATE TABLE StagingCSV
(
col1 VARCHAR(60),
col2 VARCHAR(60),
col3 VARCHAR(60),
col4 VARCHAR(60),
-- ...
)
GO
(错误行将被忽略)
BULK
INSERT StagingCSV
FROM 'c:\mycsvfile.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO
其他方法:
About Bulk Import and Bulk Export Operations
Importing Bulk Data by Using BULK INSERT or OPENROWSET
您可以使用Powershell下载文件:
$clnt = new-object System.Net.WebClient
$url = "http://www.supplier.com/products.csv "
$file = "c:\temp\Mycsv.txt"
$clnt.DownloadFile($url, $file)
答案 1 :(得分:2)
另一个简单的(虽然不是免费的,但仍然相当便宜)解决方案是使用 SQL#库,这将允许您在几行T-SQL中执行此操作。这样可以通过SQL代理作业实现自动化。
您可以使用单个命令模拟Powershell方法(由Mitch建议)以获取CSV文件,然后使用另一个命令将其读入表中:
DECLARE @Dummy VARBINARY(1)
SELECT @Dummy = SQL#.INET_DownloadFile('http://www.location.tld/file.csv',
'C:\file.csv')
INSERT INTO dbo.RealTable (Column1, Column2, ...)
EXEC SQL#.File_SplitIntoFields 'C:\file.csv', ',', 0, NULL, NULL
或者,你可以通过将CSV文件直接读入局部变量,将其拆分到一个局部变量上,然后将其分成一个临时表,然后将其拆分到你的表中来绕过去文件系统:
CREATE TABLE #CSVRows (CSV VARCHAR(MAX))
DECLARE @Contents VARBINARY(MAX)
SELECT @Contents = SQL#.INET_DownloadFile('http://www.location.tld/file.csv',
NULL)
INSERT INTO #CSVRows (CSV)
SELECT SplitVal
FROM SQL#.String_Split(CONVERT(VARCHAR(MAX), @Contents),
CHAR(13) + CHAR(10), 1)
INSERT INTO dbo.RealTable (Column1, Column2, ...)
EXEC SQL#.String_SplitIntoFields 'SELECT CSV FROM #CSVRows', ',', NULL
找到SQL#
我是SQL#库的作者,但这似乎是该问题的有效解决方案。
答案 2 :(得分:0)
我还没有看到一个可以直接从网址批量插入的示例。
因此,对于其余部分,请使用sql作业和批量插入。
批量插入变得简单:http://www.mssqltips.com/tip.asp?tip=1207
这是一个快速摘录:
BULK INSERT dbo.ImportTest FROM 'C:\ ImportData.txt'WITH( FIELDTERMINATOR =',',FIRSTROW = 2)
答案 3 :(得分:0)
您还可以使用Integration Services任务执行文件下载: http://www.sqlis.com/post/Downloading-a-file-over-HTTP-the-SSIS-way.aspx