Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 BCP. Экспорт pdf из базы на диск.  [new]
kealog
Member

Откуда:
Сообщений: 32
MS SQL 2016. В таблице базы данных dbo.tTEST два поля: ID - счётчик (bigint); FTEST - varbinary(max) - в него загружены файлы pdf.

Пытаюсь так их достать и сохранить на диск:

CREATE   PROCEDURE dbo.PDF_EXPORT
  AS
   BEGIN
     SET NOCOUNT ON
     DECLARE @cmd_export varchar(max) ='bcp "select FTEST from tTEST where ID = 9" queryout C:\MDOC\PCC_models\ReportForTest_export.pdf'
  END
  GO

Вылетает ошибка Для процедуры требуется параметр "command_string" типа "varchar".
Пожалуйста, подскажите, как исправить или иной способ экспортировать pdf-файлы из БД на диск.
Читал и пробовал уже много вариантов.

Спасибо.
13 авг 17, 01:23    [20719299]     Ответить | Цитировать Сообщить модератору
 Re: BCP. Экспорт pdf из базы на диск.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
kealog
Вылетает ошибка Для процедуры требуется параметр "command_string" типа "varchar".
При выполнении этой процедуры?
Не может быть, как минимум нужно написать xp_cmdshell
И сообщение об ошибке точнее пишите, копируйте с экрана, а не пересказывайте своими словами.
13 авг 17, 02:40    [20719303]     Ответить | Цитировать Сообщить модератору
 Re: BCP. Экспорт pdf из базы на диск.  [new]
kealog
Member

Откуда:
Сообщений: 32
Сообщение об ошибке в MS SQL Management Studio (в окне сообщений): сообщение: 214, уровень: 16, состояние: 201, процедура: xp_cmdshell, строка: 1 [строка начала пакета: 2]
Для процедуры требуется параметр "command_string" типа "varchar".
(строк обработано: 1)


В dbForge - приложил скриншот.
Картинка с другого сайта.

!В предыдущем не было показано EXEC (исправляю ниже)
CREATE   PROCEDURE dbo.PDF_EXPORT
AS
BEGIN
  SET NOCOUNT ON
  DECLARE @cmd_export varchar(max) ='bcp "select FTEST from tTEST where ID = 9" queryout C:\MDOC\PCC_models\ReportForTest_export.pdf -T -f'-- C:\MDOC\PCC_models\PDF_FORMAT.fmt'
  EXEC xp_cmdshell @cmd_export
END
GO


К сообщению приложен файл. Размер - 9Kb
13 авг 17, 08:37    [20719334]     Ответить | Цитировать Сообщить модератору
 Re: BCP. Экспорт pdf из базы на диск.  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
сообщение об ошибке довольно внятно вам говорит, что тип параметра неверный
varchar(max) это вовсе не varchar
читайте мануал по xp_cmdshell
13 авг 17, 11:31    [20719525]     Ответить | Цитировать Сообщить модератору
 Re: BCP. Экспорт pdf из базы на диск.  [new]
kealog
Member

Откуда:
Сообщений: 32
Дедушка,
Очень спасибо. Так процедура выполняется без ошибок.
CREATE   PROCEDURE dbo.PDF_EXPORT
AS
BEGIN
  SET NOCOUNT ON
  DECLARE @cmd_export VARCHAR(500) ='bcp "select FTEST from PCC.dbo.tTEST where ID = 9" queryout C:\MDOC\PCC_models\ReportForTest_export.pdf -T -f'--C:\MDOC\PCC_models\PDF_FORMAT.fmt'
  EXEC xp_cmdshell @cmd_export
END
GO

Приложен скриншот результата исполнения в SQL Management Studio и ссылка на файл формата
Но создаётся только пустой файл!!!
Пожалуйста, подскажите, в чём причина \ какое решение?
/*наличие\отсутствие префикса в pdf файле не является важным, главное, чтобы он нормально открывался ридерами*/

К сообщению приложен файл. Размер - 50Kb
13 авг 17, 13:34    [20719666]     Ответить | Цитировать Сообщить модератору
 Re: BCP. Экспорт pdf из базы на диск.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
kealog
Приложен скриншот результата исполнения в SQL Management Studio и ссылка на файл формата
В @return_value вернётся то число, которое вы туда положите оператором RETURN
То есть в вашем случае всегда 0

kealog
Пожалуйста, подскажите, в чём причина \ какое решение?
Раз создаётся пустой файл, значит, права есть.

Может, запрос не выдаёт результата?

Вы вообще выполняли вашу команду bcp, в виндах, без всяких SQL Server-ов?
И зачем опция -f без имени файла?
14 авг 17, 00:04    [20720533]     Ответить | Цитировать Сообщить модератору
 Re: BCP. Экспорт pdf из базы на диск.  [new]
kealog
Member

Откуда:
Сообщений: 32
alexeyvg,
alexeyvg
Может, запрос не выдаёт результата?
Вы вообще выполняли вашу команду bcp, в виндах, без всяких SQL Server-ов?
Выполнил в Windows с правами администратора. Выдаёт такую ошибку (см. приложенный скриншот)

alexeyvg
И зачем опция -f без имени файла?
Я запускал выполнение с файлом формата
DECLARE @cmd_export VARCHAR(500) ='bcp "select FTEST from PCC.dbo.tTEST where ID = 9" queryout C:\MDOC\PCC_models\ReportForTest_export.pdf -T -f C:\MDOC\PCC_models\PDF_FORMAT.fmt'

М.б. файл формата неправильный?
Он по этой ссылке. Взял из другой темы на этом форуме.
https://drive.google.com/open?id=0Bz8ANHnMTX8gRUkyZlpsWHBRUWM

К сообщению приложен файл. Размер - 45Kb
14 авг 17, 10:19    [20721004]     Ответить | Цитировать Сообщить модератору
 Re: BCP. Экспорт pdf из базы на диск.  [new]
aleks222
Guest
https://stackoverflow.com/questions/40845809/sql-server-bcp-export-binary-to-file-extra-data-at-the-begining-of-the-file
14 авг 17, 11:18    [20721221]     Ответить | Цитировать Сообщить модератору
 Re: BCP. Экспорт pdf из базы на диск.  [new]
aleks222
Guest
bcp "SELECT top(1) Photo FROM AdventureWorks.dbo.PhotoLibrary  queryout "e:\image\photo\expMadisonAVE.jpg" -T -n -SPROD\SQL2005' 
14 авг 17, 11:26    [20721246]     Ответить | Цитировать Сообщить модератору
 Re: BCP. Экспорт pdf из базы на диск.  [new]
kealog
Member

Откуда:
Сообщений: 32
aleks222,
Ничего не получается.
Для варианта
DECLARE @cmd_export VARCHAR(500) ='bcp "SELECT FTEST FROM PCC.dbo.tTEST where ID = 9" queryout "C:\MDOC\PCC_models\ReportForTest_export.pdf" -T -n -SPROD\SQL2005'

выдаёт ошибки
SQLState = 08001, NativeError = -1
Error = [Microsoft][ODBC Driver 13 for SQL Server]Сетевые интерфейсы SQL Server: Не удается обнаружить указанный сервер/экземпляр [xFFFFFFFF].
SQLState = 08001, NativeError = -1
Error = [Microsoft][ODBC Driver 13 for SQL Server]При установлении соединения с сервером SQL Server произошла ошибка, связанная с сетью или с определенным экземпляром. Сервер не найден или недоступен. Убедитесь, что имя экземпляра указано правильно и на с
ервере SQL Server разрешены удаленные соединения. Дополнительные сведения см. в электронной документации по SQL Server.
SQLState = S1T00, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]Время ожидания входа в систему истекло.
(null)


Для варианта
DECLARE @cmd_export VARCHAR(500) ='bcp "select FTEST from PCC.dbo.tTEST where ID = 9" queryout C:\MDOC\PCC_models\ReportForTest_export.pdf -T -f C:\MDOC\PCC_models\PDF_FORMAT.fmt'


Ошибки такие
(null)
Начато копирование...
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]Файл формата: недопустимый тип данных.
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]Не удается разрешить параметры сортировки на уровне столбцов
(null)
Ошибка BCP-копирования out
(null)

Файл формата такой
13.0
1
1 SQLVARBINARY 0 0 "" 1 FTEST ""
16 авг 17, 19:21    [20729283]     Ответить | Цитировать Сообщить модератору
 Re: BCP. Экспорт pdf из базы на диск.  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
kealog,

вы понимаете? что значит -SPROD\SQL2005 которое вы написали в своей команде?

вот такое
bcp "SELECT FTEST FROM PCC.dbo.tTEST where ID = 9" queryout "C:\MDOC\PCC_models\ReportForTest_export.pdf" -T -N
какой результат даёт?
16 авг 17, 21:08    [20729549]     Ответить | Цитировать Сообщить модератору
 Re: BCP. Экспорт pdf из базы на диск.  [new]
kealog
Member

Откуда:
Сообщений: 32
Дедушка,
Спасибо. Тоже только что нашёл, что для бинарника должен стоять параметр -n, который заменяет параметр -f. Соответственно, такая конструкция сработала!!!:
DECLARE @cmd_export VARCHAR(500) ='bcp "select FTEST from PCC.dbo.tTEST where ID = 9" queryout C:\MDOC\PCC_models\ReportForTest_export.pdf -T -n'


Дедушка
вы понимаете? что значит -SPROD\SQL2005 которое вы написали в своей команде?

Понимаю, просто когда искал решение начал пробовать уже всё подряд.
17 авг 17, 10:50    [20730362]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить