Как я могу вставить в базу данных SQL Server данные из CSV онлайн? - PullRequest
2 голосов
/ 12 марта 2011

Мне нужно каждый день выполнять загрузку данных из CSV, доступного онлайн, например. http://www.supplier.com/products.csv После того, как я выгрузил csv в таблицу sql, я могу выполнить обработку, которую мне нужно обновить / вставить и т. Д. Проблема в том, что я не знаю, как автоматизировать загрузку данных.

Я надеялся, что смогу использовать задание / задачу SQL, запланированные на выполнение каждый день в 06:00, дать ему URI, и тогда он сможет получить доступ к данным в CSV ...

Как я могу это сделать?

Ответы [ 4 ]

5 голосов
/ 12 марта 2011

Можно запланировать задание агента 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

Другие методы:

Об операциях массового импорта и массового экспорта

Импорт массовых данных с помощью 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)
2 голосов
/ 14 марта 2011

Другое простое (хотя и не бесплатное, но все же довольно дешевое) решение - использовать библиотеку 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-файл прямо в локальную переменную, разделив его в возврате каретки в таблицу Temp, а затем разделив в таблицу.:

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 # по адресу: http://www.SQLsharp.com/

Я являюсь автором библиотеки SQL #, но это кажется правильным решением вопроса.

0 голосов
/ 13 марта 2011

Вы также можете выполнить загрузку файла, используя задачу служб Integration Services: http://www.sqlis.com/post/Downloading-a-file-over-HTTP-the-SSIS-way.aspx

0 голосов
/ 12 марта 2011

Я не видел пример, где вы можете массово вставить прямо из URL.

Итак, для оставшейся части используйте задание sql и массовую вставку.

Массовая вставка стала проще: http://www.mssqltips.com/tip.asp?tip=1207

Вот краткий отрывок:

ОБЪЕМНАЯ ВСТАВКА dbo.ImportTest FROM 'C: \ ImportData.txt' WITH (FIELDTERMINATOR = ',', FIRSTROW = 2)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...