代码之家  ›  专栏  ›  技术社区  ›  Syntax Error ine

尝试从数据库下载“image”列内容时发生日期类型转换错误

  •  0
  • Syntax Error ine  · 技术社区  · 7 年前

    我正在尝试下载存储在数据库表中的所有文件/文档。表格结构如下:

    CREATE TABLE [dbo].[eAttachment](
        [eKey] [nvarchar](250) NOT NULL,
        [eSize] [int] NULL,
        [eContents] [image] NULL,
     CONSTRAINT [ePKU_eAttachment] PRIMARY KEY CLUSTERED 
    (
        [eKey] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    

    典型内容:

    esize: 173586
    ekey: 0 0000000000000000000000000005010 Filename.pdf
    econtents: 0x7B00350030000037003500460030002D003400310046....etc
    

    我尝试使用的SQL在第30行失败(下面用注释标记),错误如下。

    (5行受影响)

    (5行受影响)

    消息8114,16级,状态5,第30行

    将数据类型varchar转换为bigint时出错。

    这是完整的代码

    DECLARE @outPutPath varchar(100)
    , @i bigint
    , @init int
    , @econtents varbinary(max) 
    , @fPath varchar(max)  
    , @folderPath  varchar(max) 
    , @efolderName nvarchar(31)
    , @ekey nvarchar(250)
    
    DECLARE @Doctable TABLE (id bigint identity(1,1), ekey  nvarchar(250) , esize int, [econtents] varbinary(max) )
    
    INSERT INTO @Doctable([ekey] , [esize],[econtents])
    Select top 5 ekey, esize, econtents from eattachment
    select * from @doctable
    
    SELECT @i = COUNT(1) FROM @Doctable
    
    WHILE @i <= 5
    BEGIN 
    
        SET @ekey = (SELECT STUFF(LEFT(ekey,33),1,1,'') from @doctable where id = @i)
        SET @efoldername =  (select top 1 efoldername
                                        from efolder 
                                        where efolderid 
                                        like @ekey
                                        )
        SET @outPutPath = '\\location\to\store\files'
    
        SELECT --fails here
         @econtents = [econtents],
         @fPath = @outPutPath + '\'+ [id] + '\' + @efolderName + '\' + RIGHT(ekey, LEN(ekey) - 33), 
         @folderPath = @outPutPath + '\'+ [id]
        FROM @Doctable WHERE id = @i
    
      EXEC  [dbo].[CreateFolder]  @folderPath
      EXEC sp_OACreate 'ADODB.Stream', @init OUTPUT; 
      EXEC sp_OASetProperty @init, 'Type', 1;  
      EXEC sp_OAMethod @init, 'Open'; 
      EXEC sp_OAMethod @init, 'Write', NULL, @econtents; 
      EXEC sp_OAMethod @init, 'SaveToFile', NULL, @fPath, 2; 
      EXEC sp_OAMethod @init, 'Close'; 
      EXEC sp_OADestroy @init; 
    
      print 'Document saved to: '+  @fPath   
    
    SELECT @econtents = NULL  
    , @init = NULL
    , @fPath = NULL  
    , @folderPath = NULL
    SET @i = 1
    END
    

    为什么它会因为这个错误而失败?我希望它只是将文件复制到我的文件夹中。

    我看不到任何varchar->bigint转换正在发生,尤其是在它表示失败的线路上。

    我怀疑这和 econtents 类型为的列 image 在源表中,以及 varbinary 在临时表中。SQL告诉我不允许使用 形象 在过程/声明变量中,所以我认为它会自动转换?

    编辑:这与其他帖子无关,因为这是一个日期时间转换问题。有人已经发布了一个有效的答案,但他们已将其删除

    1 回复  |  直到 7 年前
        1
  •  1
  •   Zohar Peled    7 年前

    这是您的问题:

     @fPath = @outPutPath + '\'+ [id] + '\' + @efolderName + '\' + RIGHT(ekey, LEN(ekey) - 33), 
     @folderPath = @outPutPath + '\'+ [id]
    

    将字符串连接到bigint时,SQL Server将尝试隐式地将字符串转换为bigint和sum,而不是concat,除非您显式地将bigint转换为字符串数据类型。

    将其更改为

     @fPath = @outPutPath + '\'+ CAST([id] as varchar(21)) + '\' + @efolderName + '\' + RIGHT(ekey, LEN(ekey) - 33), 
     @folderPath = @outPutPath + '\'+ CAST([id] as varchar(21))
    

    (因为bigint的最小值有20个数字和一个减号,所以需要21个字符)。