Как передать параметры в bcp в хранимой процедуре в SQL - PullRequest
0 голосов
/ 29 апреля 2019

Мне нужно экспортировать из кода (C #) с помощью хранимой процедуры (в SQL Server 2017) некоторые файловые объекты внутри базы данных (двоичный формат) и сохранить их в каталоге сервера, на котором запущено веб-приложение. Я использую команду BCP внутри хранимой процедуры. У меня проблемы при попытке вставить параметры в хранимую процедуру.

Эта хранимая процедура без параметров работает нормально; где я могу извлечь файл с idDoc = 20167 и назвать его «tt1.pdf» в каталоге «e \ temp \ sql2017»

CREATE PROCEDURE [dbo].[spDocumentiBCP_1]
AS
BEGIN 
    DECLARE @sql VARCHAR(1000)

    SET @sql = 'BCP "SELECT binario FROM Database1.dbo.TbDocumentibin 
                     WHERE idDoc=20167" 
                     QUERYOUT e:\temp\sql2017\tt1.pdf -T -f e:\TEMP\sql2017\blob1.fmt -S PCNAME\sql2017 ' 

    EXEC master.dbo.xp_CmdShell @sql 
END

Я пытался вставить параметры в хранимую процедуру, но получаю ошибки.

Это пример хранимой процедуры, которая мне нужна, но я не знаю, как использовать параметры в этом случае внутри BCP:

CREATE PROCEDURE [dbo].[spDocumentiBCP_1]
    (@idDoc INT,
     @filename VARCHAR(150))
AS
BEGIN 
    DECLARE @sql VARCHAR(500)
    SET @sql = 'BCP "SELECT binario FROM Database.dbo.TbDocumentibin where idDoc=@idDoc" 
QUERYOUT e:\temp\sql2017\@nomefile -T -f 
e:\TEMP\sql2017\blob1.fmt -S 
PCNAME\sql2017 ' 

    EXEC master.dbo.xp_CmdShell @sql 
END

Я должен экспортировать файл-блоб из БД и сохранить его в выбранном каталоге (на сервере, на котором выполняется веб-приложение) с конкретным именем. Теперь проблема заключается в использовании параметров внутри хранимой процедуры с помощью команды BCP.

1 Ответ

1 голос
/ 29 апреля 2019

Попробуйте это

create procedure [dbo].[spDocumentiBCP_1] ( 
   @idDoc int, 
   @filename varchar(150)
)      
AS
BEGIN

Declare @sql varchar(500) 
set @sql = 'BCP "SELECT binario FROM Database.dbo.TbDocumentibin 
where idDoc=" ' + @idDoc + ' "QUERYOUT e:\temp\sql2017" ' + @filename + ' " -T -f e:\TEMP\sql2017\blob1.fmt -S PCNAME\sql2017" ' 

EXEC master.dbo.xp_CmdShell @sql 

END

Обратите внимание, что не должно быть пробелом между " и '. Я приведу пробел, чтобы сделать код более понятным. Фактический код должен быть как "' + @idDoc +'"

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