Лучший способ запросить файл csv или Excel через 64-разрядную SSMS SQL 2008 R2?

#tsql #sql-server-2008

#tsql #sql-server-2008

Вопрос:

Всем привет, у меня есть некоторые сертификаты в SQL 2008, но я ни в коем случае не мастер. Мне было любопытно, была ли моя цель запросить файл CSV или Excel на моем рабочем столе в SSMS, как это сделать? ПРЕЖДЕ чем кто-либо упомянет Openrowset и включит его через sp_configure, я попробовал это, и, похоже, это не работает при попытке использовать драйвер Microsoft.Jet.OLEDB.4.0, драйверы MSADSAL или другие итерации. Это выдает некоторую ошибку о том, что серверу не разрешено иметь значение null или что это может выполняться только в однопоточном режиме. Я прочитал об этом, и многие люди утверждают, что для его получения вам нужно запустить 32-разрядную версию или аналогичную. Что меня смущает, так это то, что я могу использовать метод ‘BULK’ с Openrowset, а затем выбрать ‘Single_Clob’, однако я получаю разделенную запятыми строку, которую мне затем придется разобрать.

В чем мой реальный вопрос: есть ли простой способ просто быстро запросить файл CSV или Excel в 64-разрядной версии SSMS 2008 R2?

Ответ №1:

Драйвер Jet работает только в 32-разрядном режиме. Смотрите этот блог MSDN. Можете ли вы использовать SQL CLR?

Обычно мы используем пакеты SSIS для импорта данных CSV / XLS в таблицу для запроса — аналогично тому, что SSMS сделает для вас автоматически, если вы щелкните правой кнопкой мыши и выберите импорт.

Проблема, с которой вы столкнулись, заключается в том, что Excel и CSV не являются базами данных. Чтобы запросить их, вы должны получить их в СУБД.

Комментарии:

1. Да, я использую SSIS, но есть проблема с SSIS, о которой никто не думает. Столбцы могут время от времени меняться, поэтому вы не можете постоянно использовать SSIS. Мне было интересно, думал ли кто-нибудь, что XP_CmdShell (? может быть неправильное название) может быть жизнеспособным в сочетании с bcp? Я думал, что кто-то где-то писал об этом, но я не могу вспомнить. Я знаю, что часто мне не нужна вся таблица, а только ее часть в списке, который кто-то мне дает.

2. Если ваши столбцы изменяются — вам все равно придется обновлять свои SQL-запросы. Вам просто нужно обновить свою схему SSIS при изменении столбцов. Вам будет сложно реализовать это, потому что вы не можете получить согласованные исходные файлы (даже если вы определяете N источников стандартной схемы)

3. ??? Вы можете выполнить ‘select * from <object>’ практически в каждом представлении, табличной функции или таблице. Я имел в виду, что исходный файл может меняться со столбцов 2 на 3 или 4 и т.д…. Так же могут быть типы данных. Я надеялся, что существует эквивалент OpenRowSet для учета этого для 64-разрядной версии. Кто-нибудь знает, как выполнить командную оболочку с помощью BCP?

Ответ №2:

Понял это:

Подход A: bcp:

  1. Убедитесь, что xp_cmdshell включен. (Если вы работаете в производственной среде корпоративной компании, это может быть невозможно по соображениям безопасности. Вы всегда можете использовать БЕТА-версию или среду контроля качества, чтобы сначала поместить данные и, надеюсь, настроить связанные серверы).

    exec sp_configure ‘xp_cmdshell’, 1 перенастроить

  2. Создайте файл csv для целей тестирования. Я создал плоский файл csv с тремя столбцами как таковой:

A, Бретт, 1 B, Джон, 2 C, Брайан, 3

  1. Создайте временную или постоянную таблицу, соответствующую типам данных, показанным здесь:

    создать тест таблицы (значение varchar(3), имя varchar(16), идентификатор int)

  2. Запустите bcp из командной оболочки, чтобы убедиться, что файл не открыт.

    Тест bcp EXEC xp_cmdshell..Тест в «C:testTest.txt » -c -t , -r n -T’ ИДИ

если вам интересны коммутаторы с bcp, воспользуйтесь файлом справки: EXEC xp_cmdshell ‘bcp /?’ ! Для меня этот метод работал в SQL 2005 и НЕ РАБОТАЛ в SQL 2008 и 2008 R2 с этим исключением: Ошибка = [Microsoft] [Собственный клиент SQL] Неожиданный EOF, обнаруженный в файле данных BCP. Я смотрел, смотрел и смотрел, но, похоже, мой файл в стандартном формате UTF со стандартным разделителем запятой и стандартным переводом строки n SQL bcp не нравится. Однако мое следующее решение сработало сразу.

Подход B: массовая вставка:

  1. Выполните шаги 2 и 3 выше того же

  2. Запустите массовую вставку как таковую:

    МАССОВАЯ ВСТАВКА dbo.Тест ИЗ ‘C:testTest.csv ‘ С ПОМОЩЬЮ (FIELDTERMINATOR = ‘,’, ROWTERMINATOR = ‘n’)

Пока ваши табличные типы данных соответствуют импорту, все должно быть в порядке. В конечном счете, простое создание таблицы и трехстрочный оператор для меня довольно быстры по сравнению с необходимостью постоянно запускать мастер или открывать студию разработки Business Intelligence, после чего я мог бы просто написать собственное приложение на C #.