копировать файлы с сервера на другой с помощью t-sql

Я попал в беду. Мне нужно скопировать файл с одного сервера на другой с помощью T-sql. Формат варьируется (pdf, xlsx, doc, jpg), но обычно это Excel .xlsx.

На данный момент мое решение состоит в том, чтобы преобразовать файл на исходном сервере в varbinary data и передать его в качестве параметра хранимой процедуре, расположенной на целевом сервере.

Код исходного сервера:

DECLARE @temp table(data varbinary (max))
DECLARE @out varbinary(max)

INSERT INTO @temp(data)
SELECT * FROM OPENROWSET(BULK N'C:\original.xlsx', SINGLE_BLOB) as data

SELECT @out=data FROM @temp
EXEC DEST_SERVER.copy @out

(Я знаю, что код уродлив и избыточен, но пока все идет хорошо)

Код на целевом сервере:

CREATE PROCEDURE copy @in varbinary(max)
AS
BEGIN
    CREATE TABLE ##temp(data varbinary(max))
    insert into ##temp(data) values(@in)
    declare @SQLcommand varchar(1000)
    set @SQLcommand = 'bcp "SELECT data FROM ##temp" queryout "C:\copied.xlsx" -T -S ' + @@SERVERNAME + ' -n'
    exec xp_cmdshell @SQLcommand
    DROP TABLE ##temp
END

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

Конкретно в новом файле в начале немного больше битов, все остальное идентично:

исходный.xlsx

50 4B 03 04 14 00 06 00

08 00 00 00 21 00 A7 95

F9 99 84 01 00 00 14 06

00 00 13 00 DD 01 5B 43

6F 6E 74 65 6E 74 5F 54

и т.д...

скопированный.xlsx

4F 32 00 00 00 00 00 00 -> эти байты новые

50 4B 03 04 14 00 06 00

08 00 00 00 21 00 A7 95

F9 99 84 01 00 00 14 06

00 00 13 00 DD 01 5B 43

6F 6E 74 65 6E 74 5F 54

и т.д...

Что я делаю не так ?,


person Rodrigo    schedule 21.11.2014    source источник


Ответы (1)


У парня в этом посте была такая же проблема. Он исправляет это, указав файл формата с помощью команды bcp. Я думаю, что это может быть и ваша проблема. Похоже, это может иметь какое-то отношение к bcp и столбцу varbinary.

SQL Server BCP экспортирует поврежденный файл?

надеюсь, это поможет

person Spock    schedule 20.12.2014
comment
Большое тебе спасибо. Хотел обойти bcp, но с вашей помощью проблема решилась и придется пользоваться. Спасибо еще раз. - person Rodrigo; 22.12.2014
comment
Если это так, вы считали, что xp_cmdshell просто копирует файл? - person Spock; 22.12.2014