Не удается открыть файл данных bcp на сервере

Обновлено: 21.11.2024

SET @dbFile = 'D:\MSSQL\Reports\GrowthStatistics_' + CONVERT ( char ( 8 ), GETDATE (), 112 ) + '.csv'

SELECT @dbColumnHeader = COALESCE ( @dbColumnHeader + ',' , '' )+ '''' + имя_столбца + '''' ИЗ INFORMATION_SCHEMA . СТОЛБЦЫ, ГДЕ TABLE_NAME = @dbTable

SELECT @dbCommand = 'bcp "SELECT ' + @dbColumnHeader + ' UNION ALL SELECT DatabaseName,CAST(OriginalSizeMB AS VARCHAR(15)) ИсходныйSizeMB,CAST(LastWeekMB AS VARCHAR(15)) LastWeekMB,CAST(NewSizeMB AS VARCHAR( 15)) NewSizeMB,CAST(LargerMB AS VARCHAR(15)) LargerMB,[%Growth],[%Reduction] FROM DBA.dbo.GrowthStatistics" queryout ' + @dbFile + ' -SserverName -c -t, -T '< /p>

Но сегодня мне нужно было изменить @dbFile для вывода файла в UNC, например:


SET @dbFile = '\\share\path\Reports \ GrowthStatistics_' + CONVERT ( char ( 8 ), GETDATE (), 112 ) + '.csv'

И это не удалось с обеими этими ошибками:

Сообщение 22051, уровень 16, состояние 1, строка 0
Файл вложения " \\share\path\Reports\GrowthStatistics_20200227.csv" недействителен.

Ну, для этого есть несколько разных причин, но в основном это возможность прочитать этот путь UNC. или неспособность, я должен сказать. 😉 В моем случае служебная учетная запись SQL Server не имела доступа к тому новому общему ресурсу, который мы пытались получить по пути UNC.

Администратор безопасности указал, что он настроен с правильными разрешениями, когда я проверял, но это все равно не сработало. Немного погуглив, и я нашел очень умный и БЫСТРЫЙ способ проверить доступ SQL Server к каталогу где-то в файловой системе. Запустите этот оператор из SQL Server, указав DIR на путь, который вы пытаетесь найти.




Вернулся к моему администратору безопасности с этим доказательством, и он внес еще одно изменение. и теперь все хорошо.

Надеюсь кому-то помог.



У меня есть хранимая процедура, которая время от времени запускается по заданию для BCP некоторых файлов, оставленных написанным мной приложением.

Я заметил, что файлы накапливаются, а BCP не забирает их, поэтому я провел тестирование в Management Studio, используя следующее:

И получил это сообщение об ошибке

Выполнение из командной строки на том же сервере с использованием той же команды не вызывает проблем.

Вот еще несколько наблюдений:

  1. Я могу запустить EXEC master..xp_cmdshell 'dir C:\*.*', и результаты вернутся, как и ожидалось.
  2. Если я копирую и переименовываю файл во что-то другое, BCP забирает его
  3. Мое приложение не оставляет файл открытым: я могу перемещать его, переименовывать, редактировать и сохранять, удалять и т. д. без каких-либо жалоб со стороны Windows.
  4. Внутренний формат файла, очевидно, подходит (см. 2.)
  5. NT SERVICE\MSSQLSERVER имеет разрешения на полный доступ к каталогу.
  6. Вчера "Мэйпл Лифс" обменяли Диона Фанефа

Любая помощь приветствуется.

Можете ли вы попробовать указать в сценарии полный путь к bcp? например `C:\Program Files\Microsoft SQL Server\100\Tools\Binn`

3 ответа 3

Я только что заставил ваш код работать на моей стороне.

Вариант А

  1. Назначьте разрешения Full Control NTFS для файла C:\BCPFiles\bcpFile.dat пользователю, которого вы будете использовать в SQL Server Management Studio для выполнения запроса.
  2. Повторно запустите запрос в SQL Server Management Studio.

Вариант Б

Или, чтобы обойти следующую ошибку, попробуйте:

в типе командной строки (чтобы создать фиктивный файл -- да, будут ошибки импорта, но только для того, чтобы не открывать файл. )

Повторно запустите запрос в SQL Server Management Studio

Если вариант А работает, проблема заключается в разрешениях. Если вариант B работает (обход исходной ошибки), то у вас есть открытый файл, даже если он не кажется открытым. Существуют утилиты, которые помогают найти эти открытые файлы, но дешевый и простой способ проверки — это просто перезагрузить сервер — надеюсь, это блок разработки/тестирования.

Утилита SQL BCP может использоваться для экспорта данных из таблиц базы данных SQL Server в текстовый файл в локальных папках или общих сетевых ресурсах. Недавно при тестировании команды SQL Server BCP для параметров формата экспорта данных я столкнулся со следующей ошибкой SQL Server.

SQLState = S1000, NativeError = 0
Error = [Microsoft][SQL Server Native Client 11.0]Невозможно открыть файл данных узла BCP

Команда BCP в моем примере использует SQL-запрос для извлечения данных из таблицы базы данных и пытается экспортировать данные в текстовый файл. Точное местоположение текстового файла указывается в команде BCP.Если требуемое разрешение на запись в папку с целевым файлом не предоставлено службе SQL Server, механизм SQL Server выдает ошибку SQL BCP «Невозможно открыть файл данных хоста BCP».

Я использовал следующий запрос Transact-SQL для возврата набора записей из примера базы данных SQL Server AdventureWorks на SQL Server 2012.

DECLARE @cmd varchar(1000)
SET @cmd = 'bcp "ВЫБЕРИТЕ Имя, Фамилию ИЗ AdventureWorks2012.Person.Person" queryout "c:\textfile.txt" -c -UTF8 -T -Slocalhost'
Мастер EXEC..xp_cmdshell @cmd

Я указал корневую папку диска C на сервере, чтобы записать возвращенный набор данных в текстовый файл. Поскольку я не настраивал никаких параметров безопасности на корневом диске (или, в вашем случае, на целевой папке с файлами), SQL Server выдаст следующую ошибку BCP, как показано на снимке экрана в SQL Server Management Studio.

После того, как я предоставил пользователю службы SQL Server разрешение на запись в связанную папку с целевым файлом, я смог успешно запустить утилиту SQL BCP и экспортировать данные в текстовый файл на сервере.

Вот еще один пример и пошаговое решение ошибки BCP на экземпляре SQL Server 2017.
В следующем примере запроса SQL BCP я пытаюсь экспортировать данные из таблицы базы данных SQL Server в текстовый файл, используя параметр queryout, который указывает, что для чтения данных используется запрос SQL Select.

declare @SQL varchar(8000)
set @SQL = 'bcp "ВЫБЕРИТЕ первого клиента ИЗ кодяз.dbo.MyOrders" queryout "C:\Eralper\Orders.txt" -T -n -S ServerName \InstanceName'
exec xp_cmdshell @SQL

Выход хранимой процедуры SQL Server xp_cmdshell выглядит следующим образом, поскольку я не настроил никаких настроек безопасности/разрешений для целевой выходной папки.

SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]Невозможно открыть файл данных узла BCP

Инструмент запуска служб.
Найдите службу SQL Server, с которой работает ваш SQL Engine.
Если на вашем сервере установлено несколько экземпляров SQL Server, выберите правильную службу SQL Server.

Дважды щелкните имя службы, чтобы отобразить ее свойства.
Перейдите на вкладку «Учетная запись» и получите имя учетной записи, с которой работает экземпляр SQL Server.
Системные администраторы предоставят этой служебной учетной записи права на запись в целевой папке выходных файлов.

Запустите проводник Windows и щелкните правой кнопкой мыши целевую папку с файлами, в которую вы хотите экспортировать данные SQL Server с помощью утилиты BCP.
Поскольку учетная запись службы SQL Server не имеет разрешений на запись в эту папку с файлами, пользователи SQL сталкиваются с ошибкой «Невозможно открыть файл данных узла BCP».
Теперь мы предоставим разрешение на запись учетной записи SQL «MSSQL$KODYAZ2017». которые мы определили на предыдущем шаге.

Я получаю указанную выше ошибку, когда запускаю BCP. Расположение файла не на локальном компьютере. это сетевой диск. Пожалуйста, помогите!

15 ноября 2005 г., 11:06

Сначала можно подключить сетевой диск, а затем использовать для этого подключенный диск.

16 ноября 2005 г., 6:12

Каждый раз, когда я получаю это сообщение, это происходит по одной из трех причин:

1) Неверный путь/имя файла (проверьте ввод/орфографию)

2) Файл не существует. (убедитесь, что файл находится там, где вы ожидаете)

3) Файл уже открыт другим приложением. (закройте другое приложение, чтобы освободить файл)

Для 1) и 2) помните, что пути относятся к тому месту, где выполняется bcp. Убедитесь, что bcp.exe может получить доступ к файлу/пути из его контекста.

16 ноября 2005 г., 13:00

Кроме того, если в имени есть пробелы, не забудьте взять двойные кавычки . например "C:\Program Files". Если вы выполняете из xp_cmdshell, вы можете попробовать команду DIR в xp_cmdshel, чтобы проверить безопасность. Я бы также воздержался от подключенных дисков, так как SQL Server узнает о них только при каждом запуске службы, а UNC — это то, что нужно.

С уважением, Руди Комаксар, старший администратор базы данных "Ave Caesar! - Morituri te salutamus."

16 ноября 2005 г., 13:06

Спасибо всем за ответ.Этот вопрос был решен. я пытался вывести BCP на логический диск, который был правильно сопоставлен. но затем мой сетевой администратор сказал мне, что сервер sql не может получить доступ к сетевому диску из-за некоторых проблем с разрешениями.

27 апреля 2007 г., 8:42

я получил эту ошибку при запуске команды bcp из xp_cmdshell

если я запускаю bcp отдельно в командной строке DOS, все работает нормально

Кто-нибудь знает информацию для решения этой проблемы? Спасибо

27 апреля 2007 г., 9:14

настоящая ошибка так и не попала в сообщение.

С уважением, Руди Комаксар, старший администратор базы данных "Ave Caesar! - Morituri te salutamus."

27 апреля 2007 г., 17:01

Проверьте разрешения для учетной записи, на которой работает агент SQL Server.

Это может быть не так, как для SQL Server.

8 мая 2007 г., 23:26

У меня возникает та же проблема в следующем сценарии

Я создал одну таблицу "T1", используя файловую группу "A", содержащую только файл данных "A_1.ndf" размером 100M и отключенный авторост. Размер этой файловой группы достигает 100M, что означает, что она заполнена на 100%. Теперь я пытаюсь заархивировать данные этой таблицы "T1" с помощью команды bcp следующим образом:

bcp T1 out D:\Archive -S -U -P -b 10000 -c -t |;

выдает следующую ошибку:

"SQLState = S1000, NativeError = 0

Ошибка = [Microsoft][Драйвер ODBC SQL Server]Невозможно открыть файл данных хоста BCP"

При выполнении команды bcp требуется ли место в файловой группе "A"?

Может ли кто-нибудь помочь, как решить эту проблему?

8 мая 2007 г., 23:48

Каков результат?

9 мая 2007 г., 00:24

Спасибо за быстрый ответ, результат ниже

Пожалуйста, дайте мне знать, если вам нужна другая информация

10 мая 2007 г., 2:24

bcp T1 out D:\Archive -S -U -P -b 10000 -c -t |;

.. это настоящая командная строка? В двух местах это выглядит подозрительно.

Если вы не хотите, чтобы ваш файл назывался "Архив", вы не указали имя файла, а указали только каталог "D:\Archive"

..является ли разделителем вертикальная черта + точка с запятой?

В любом случае канал в командной строке действует как оператор перенаправления, поэтому попробуйте заключить его в кавычки.

bcp T1 out D:\Archive -S -U -P -b 10000 -c -t " |; "

(если точка с запятой - это просто "конец оператора", просто удалите ее-)

10 мая 2007 г., 7:03

Еще один момент. Таблица, обозначенная как T1, не квалифицирована. В зависимости от предоставленного идентификатора пользователя это может изменить базу данных, в которой будет искаться таблица. По умолчанию это будет основная база данных. Я предлагаю уточнить имя таблицы в вашем заявлении bcp, чтобы устранить любую потенциальную путаницу или ошибки.

С уважением, Руди Комаксар, старший администратор базы данных "Ave Caesar! - Morituri te salutamus."

11 мая 2007 г., 00:51

Это также может быть вызвано учетной записью, которую использует BCP, так как вы используете SQL Login, это может быть:

Ваша учетная запись при запуске из командной строки

Учетная запись службы SQL Server при использовании xp_cmdshell

Служебная учетная запись агента SQL Server, если она выполняется в CmdExec или T-SQL с шагом xp_cmdshell. Учетную запись также можно настроить в задании.

Учетной записи BCP требуется доступ к файлу, для UNC это включает общий доступ.

Уловка для локальной службы состоит в том, чтобы предоставить учетной записи компьютера SQL Server эти сетевые разрешения.

Для UNC со службой, использующей учетную запись домена, необходимо проверить разрешения, войдя в систему с учетной записью службы, перейдите к соответствующему файлу и запустите BCP из строки cmd.

Выполните команду BCP сегодня и поместите результаты запроса в файл Excel локально.
Команда:
EXEC master.. Произвольный N 'BCP «SELECT» ID базы данных', ' 'имя базы данных', «ID объекта»', ''имя таблицы', « запрос»», «общее потребление процессорного времени (мс)», «время выполнения», «среднее потребление процессорного времени (мс)», ' ' 'последнее время выполнения,' минимальное время выполнения (мс)] ', ''максимальное время выполнения (мс)' UNION ALL SELECT CAST (dbid AS NVARCHAR(100)),dbname,CAST(ObjectId AS NVARCHAR(100)) ,ObjectName ,SelectStatement ,CAST(total_worker_time AS NVARCHAR(100)) , CAST(количество_выполнений AS NVARCHAR(100)) ,CAST(среднее_прошедшее_время AS NVARCHAR(100)) ,CAST(время_последнего_выполнения AS NVARCHAR(100)),CAST(min_worker_time AS NVARCHAR(100)) ,CAST(max_worker_time AS NVARCHAR(100)) FROM db.dbo.bdd_temp_find_top_select_cpu "запрос e: top_select_cpu.txt-cs "10.0.8.102\sqlinstance" -t '
Ошибка:


Что пошло не так:
Возможно, у вас нет пути или у вас нет прав на запись для пути.
Решение. Укажите путь с разрешениями или предоставьте соответствующие разрешения.
Я выбрал путь с разрешением:
EXEC master..Произвольный N 'BCP «SELECT» ID базы данных', ' 'имя базы данных', «ID объекта»', ' 'имя таблицы', «запрос»', 'общее потребление процессорного времени (мс)' , 'время выполнения',' 'среднее потребление процессорного времени (мс)', ' ' 'время последнего выполнения,' минимальное время выполнения (мс)] ', ''максимальное время выполнения (мс)' UNION ALL SELECT CAST (dbid AS NVARCHAR (100)), dbname, CAST (ObjectId AS NVARCHAR (100)) , ObjectName , SelectStatement , CAST (total_worker_time AS NVARCHAR (100)) , CAST (выполнение_count AS NVARCHAR (100)) , CAST ( avg_elasped_time AS NVARCHAR(100)) ,CAST(последнее_время_выполнения AS NVARCHAR(100)),CAST(min_worker_time AS NVARCHAR(100)) ,CAST(max_worker_time AS NVARCHAR(100)) FROM db.dbo.bdd_temp_find_top_select_cpu «queryout \\10.0.9.177\software \ top_select_cpu.txt-cs "10.0.8.102\sqlinstance" -t '

Читайте также: