SQL 服务器使用触发器获取空文件从插入的 table(文件流)写入 .pdf

SQL Server write .pdf from inserted table (filestream) using trigger getting empty files

我正在尝试创建一个插入后触发以将上次创建的文件流写入自定义文件夹

结果=空文件(0Ko)(附图片)

产品:MSSQL server 2012 sp4 express

    BEGIN

SET NOCOUNT ON;

DECLARE @NameFile VARCHAR(100)
DECLARE @StreamID VARCHAR(200)
DECLARE @SaveDirectory VARCHAR(200)
DECLARE @FileData VARBINARY(MAX)
DECLARE @ObjectToken INT

select @StreamID= i.stream_id, @NameFile = i.name from inserted i

set @FileData=(select file_stream from DocumentFiles where stream_id = @StreamID)
set @SaveDirectory = 'C:\Temp\'+ REPLACE(@NameFile, 'V-FA-', '')

EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT
EXEC sp_OASetProperty @ObjectToken, 'Type', 1
EXEC sp_OAMethod  @ObjectToken, 'Open'
EXEC sp_OAMethod  @ObjectToken, 'Write', NULL,@FileData
EXEC sp_OAMethod  @ObjectToken, 'SaveToFile', NULL, @SaveDirectory, 2
EXEC sp_OAMethod  @ObjectToken, 'Close'
EXEC sp_OADestroy @ObjectToken

END

sp_OAMethod returns 一个值,指示操作是否正确执行。您可以尝试通过用类似的代码包装每个调用来追踪问题:

EXEC  @hr = sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT
        IF @hr <> 0  
            BEGIN  
                    RAISERROR('Error %d ADODB.Stream.', 16, 1, @hr)
                    RETURN
            END
EXEC  @hr = sp_OASetProperty @ObjectToken, 'Type', 1
        IF @hr <> 0  
            BEGIN  
                    RAISERROR('Error %d Type.', 16, 1, @hr)
                    RETURN
            END
EXEC  @hr = sp_OAMethod @ObjectToken, 'Open'
        IF @hr <> 0  
            BEGIN  
                    RAISERROR('Error %d Open.', 16, 1, @hr)
                    RETURN
            END
EXEC  @hr = sp_OAMethod @ObjectToken, 'Write', NULL, @BinaryData
        IF @hr <> 0  
            BEGIN  
                    SET @Error='Error %d Write. '+@SourceName
                    RAISERROR(@Error, 16, 1, @hr)
                    RETURN
            END
EXEC  @hr = sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @FilePath, 2
        IF @hr <> 0  
            BEGIN  
                    RAISERROR('Error %d SaveToFile.', 16, 1, @hr)
                    RETURN
            END
EXEC  @hr = sp_OAMethod @ObjectToken, 'Close'
        IF @hr <> 0  
            BEGIN  
                    RAISERROR('Error %d Close.', 16, 1, @hr)
                    RETURN
            END
EXEC  @hr = sp_OADestroy @ObjectToken
        IF @hr <> 0  
            BEGIN  
                    RAISERROR('Error %d Destroy.', 16, 1, @hr)
                    RETURN
            END