Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用触发器从插入的表(filestream)中写入.pdf以获取空文件_Sql Server_Triggers_Filestream - Fatal编程技术网

Sql server 使用触发器从插入的表(filestream)中写入.pdf以获取空文件

Sql server 使用触发器从插入的表(filestream)中写入.pdf以获取空文件,sql-server,triggers,filestream,Sql Server,Triggers,Filestream,我正在尝试在插入后创建一个触发器,以将上次创建的文件流写入自定义文件夹 结果是=空文件(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) DECL

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

结果是=空文件(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\u OAMethod返回一个值,该值指示是否执行了无错误的操作。您可以尝试通过使用类似代码包装每个调用来跟踪问题:

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
EXEC@hr=sp_OACreate'ADODB.Stream',@ObjectToken输出
如果@hr 0
开始
RAISERROR('错误%d ADODB.Stream',16,1,@hr)
返回
结束
EXEC@hr=sp_OASetProperty@ObjectToken,'Type',1
如果@hr 0
开始
RAISERROR('错误%d类型',16,1,@hr)
返回
结束
EXEC@hr=sp_OAMethod@ObjectToken,“打开”
如果@hr 0
开始
RAISERROR('打开错误%d',16,1,@hr)
返回
结束
EXEC@hr=sp_OAMethod@ObjectToken'Write',NULL,@BinaryData
如果@hr 0
开始
设置@Error='Error%d Write'+@源名称
RAISERROR(@Error,16,1,@hr)
返回
结束
EXEC@hr=sp_OAMethod@ObjectToken,'SaveToFile',NULL,@FilePath,2
如果@hr 0
开始
RAISERROR('Error%d SaveToFile',16,1,@hr)
返回
结束
EXEC@hr=sp_OAMethod@ObjectToken,“Close”
如果@hr 0
开始
RAISERROR('错误%d关闭',16,1,@hr)
返回
结束
EXEC@hr=sp_OADestroy@ObjectToken
如果@hr 0
开始
RAISERROR('Error%d Destroy',16,1,@hr)
返回
结束

您的触发器代码有一个主要缺陷。它假定插入的行中只有一行。sql server中的触发器在每个操作中调用一次,插入和删除的表中可以且将包含多行。感谢您的评论,您有什么建议?@SeanLange我只从插入的表中选择了流Id和名称,之后,我将尝试使用Stream_IDF获取StreamFile。对于您所处的情况,您需要将其包装在光标中,以确保捕获所有插入的行。实际上,插入的表只包含一行,这是最后插入的行。我将编辑查询并给您反馈,谢谢