如何从在线CSV插入SQL Server数据库数据?

时间:2011-03-12 09:04:57

标签: sql-server tsql

我需要每天从网上提供的csv执行dataload,例如http://www.supplier.com/products.csv 一旦我将csv转储到sql表中,我就可以进行处理,然后需要更新/插入等。问题是我不知道如何自动化dataload。

我希望我可以使用SQL作业/任务,计划每天06:00运行,给它一个uri,然后它可以访问csv中的数据......

我该怎么做?

4 个答案:

答案 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

您可以在http://www.SQLsharp.com/

找到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