Я попал в беду. Мне нужно скопировать файл с одного сервера на другой с помощью 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
и т.д...
Что я делаю не так ?,