我需要每天从在线csv文件(例如http://www.supplier.com/products.csv)执行数据加载。将csv转储到sql表格后,我可以进行所需的处理,然后需要更新/插入等操作。问题是我不知道如何自动化数据加载。
我希望能够使用SQL作业/任务,安排在每天06:00运行,给它一个URI,然后它就可以访问csv中的数据...
我该怎么做?
我希望能够使用SQL作业/任务,安排在每天06:00运行,给它一个URI,然后它就可以访问csv中的数据...
我该怎么做?
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
其他方法:
使用BULK INSERT或OPENROWSET导入大量数据
您可以使用Powershell下载文件:
$clnt = new-object System.Net.WebClient
$url = "http://www.supplier.com/products.csv "
$file = "c:\temp\Mycsv.txt"
$clnt.DownloadFile($url, $file)
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
我还没有见过可以直接从 URL 批量插入的例子。
因此,剩下的部分使用 SQL 作业和批量插入。
批量插入变得更容易:http://www.mssqltips.com/tip.asp?tip=1207
以下是一个快速摘录:
BULK INSERT dbo.ImportTest FROM 'C:\ImportData.txt' WITH ( FIELDTERMINATOR =',', FIRSTROW = 2 )
您还可以使用集成服务任务执行文件下载: http://www.sqlis.com/post/Downloading-a-file-over-HTTP-the-SSIS-way.aspx