#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:
-
Убедитесь, что xp_cmdshell включен. (Если вы работаете в производственной среде корпоративной компании, это может быть невозможно по соображениям безопасности. Вы всегда можете использовать БЕТА-версию или среду контроля качества, чтобы сначала поместить данные и, надеюсь, настроить связанные серверы).
exec sp_configure ‘xp_cmdshell’, 1 перенастроить
-
Создайте файл csv для целей тестирования. Я создал плоский файл csv с тремя столбцами как таковой:
A, Бретт, 1 B, Джон, 2 C, Брайан, 3
-
Создайте временную или постоянную таблицу, соответствующую типам данных, показанным здесь:
создать тест таблицы (значение varchar(3), имя varchar(16), идентификатор int)
-
Запустите 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: массовая вставка:
-
Выполните шаги 2 и 3 выше того же
-
Запустите массовую вставку как таковую:
МАССОВАЯ ВСТАВКА dbo.Тест ИЗ ‘C:testTest.csv ‘ С ПОМОЩЬЮ (FIELDTERMINATOR = ‘,’, ROWTERMINATOR = ‘n’)
Пока ваши табличные типы данных соответствуют импорту, все должно быть в порядке. В конечном счете, простое создание таблицы и трехстрочный оператор для меня довольно быстры по сравнению с необходимостью постоянно запускать мастер или открывать студию разработки Business Intelligence, после чего я мог бы просто написать собственное приложение на C #.