복붙노트

[SQL] 스크립트 디스크에 VARBINARY 데이터를 저장하기

SQL

스크립트 디스크에 VARBINARY 데이터를 저장하기

나는 MS SQL 서버의 테이블에 저장된 일부 VARBINARY 데이터가 2005 년 (VARBINARY의 단일 열을 반환하는 쿼리 보증을 말할 수)와 (하나 개의 파일을 디스크에 바이트를 출력 입력으로 쿼리를 취 SQL 코드를 가지고있다 누구 난 행 당?) 확인이 전에 천 번을 요청했지만, 인터넷 검색은 대부분 .NET 솔루션과 함께 제공됩니다. 나는 SQL 솔루션을 원한다.

해결법

  1. ==============================

    1.BCP에 접근 나를 위해 작동하지 않습니다. 는 그물 내가 저장된 객체에 다시 역 직렬화 할 수없는 디스크에 기록 바이트. 이 방법은 디스크에있는 바이트 저장 무슨에 해당되지 않았는지 확인하십시오. 아마도 BCP는 헤더의 어떤 종류를 쓰고있다. 잘 모르겠 는데요.

    BCP에 접근 나를 위해 작동하지 않습니다. 는 그물 내가 저장된 객체에 다시 역 직렬화 할 수없는 디스크에 기록 바이트. 이 방법은 디스크에있는 바이트 저장 무슨에 해당되지 않았는지 확인하십시오. 아마도 BCP는 헤더의 어떤 종류를 쓰고있다. 잘 모르겠 는데요.

    나는 기사의 하단에 여기에 다음 코드를 발견했다. 그것은 잘 작동합니다! 이 저장된 BMP 이미지를위한되었지만, 어떤 VARBINARY와 함께 작동합니다.

    DECLARE @SQLIMG VARCHAR(MAX),
        @IMG_PATH VARBINARY(MAX),
        @TIMESTAMP VARCHAR(MAX),
        @ObjectToken INT
    
    DECLARE IMGPATH CURSOR FAST_FORWARD FOR 
            SELECT csl_CompanyLogo from mlm_CSCompanySettingsLocalizations
    
    OPEN IMGPATH 
    
    FETCH NEXT FROM IMGPATH INTO @IMG_PATH 
    
    WHILE @@FETCH_STATUS = 0
        BEGIN
            SET @TIMESTAMP = 'd:\' + replace(replace(replace(replace(convert(varchar,getdate(),121),'-',''),':',''),'.',''),' ','') + '.bmp'
    
            PRINT @TIMESTAMP
            PRINT @SQLIMG
    
            EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT
            EXEC sp_OASetProperty @ObjectToken, 'Type', 1
            EXEC sp_OAMethod @ObjectToken, 'Open'
            EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @IMG_PATH
            EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @TIMESTAMP, 2
            EXEC sp_OAMethod @ObjectToken, 'Close'
            EXEC sp_OADestroy @ObjectToken
    
            FETCH NEXT FROM IMGPATH INTO @IMG_PATH 
        END 
    
    CLOSE IMGPATH
    DEALLOCATE IMGPATH
    
  2. ==============================

    2.나는 LinqPad을 사용하려면 다른 사람이 작업 솔루션을 빠르게 얻을 수 있도록하는 것이, JohnOpincar의 대답에 구축이를 추가하고있다.

    나는 LinqPad을 사용하려면 다른 사람이 작업 솔루션을 빠르게 얻을 수 있도록하는 것이, JohnOpincar의 대답에 구축이를 추가하고있다.

    /*
    This LinqPad script saves data stored in a VARBINARY field to the specified folder.
    1. Connect to SQL server and select the correct database in the connection dropdown (top right)
    2. Change the Language to C# Program
    3. Change "Attachments" to the name of your table that holds the VARBINARY data
    4. Change "AttachmentBuffer" to the name of the field that holds the data
    5. Change "Id" to the unique identifier field name
    6. Change "1090" to the identity of the record you want to save
    7. Change the path to where you want to save the file. Make sure you choose the right extension.
    
    Notes: Windows 10 may give you "Access Denied" error when trying to save directly to C:\. Rather save to a subfolder.
    */
    
    void Main()
    {
        var context = this;
        var query = 
            from ci in context.Attachments
            where ci.Id == 1090
            select ci.AttachmentBuffer
        ;
        byte[] result = query.Single().ToArray();
        File.WriteAllBytes(@"c:\DEV\dumpfile.xlsx", result);
        Console.WriteLine("Done");
    }
    
  3. ==============================

    3.당신은 BCP가 아닌 T-SQL을 사용하지만, 잘 작동 할 수 있습니다.

    당신은 BCP가 아닌 T-SQL을 사용하지만, 잘 작동 할 수 있습니다.

    BCP "SELECT FileContent FROM table WHERE ID = 1" queryout "C:\file.txt" -T
    
  4. ==============================

    4.나는 이전 게시물 알고,하지만 난 다음이 작동하지 않는 이유와 그것을 해결하는 방법을 알아 냈 :

    나는 이전 게시물 알고,하지만 난 다음이 작동하지 않는 이유와 그것을 해결하는 방법을 알아 냈 :

    BCP "SELECT FileContent FROM table WHERE ID = 1" queryout "C:\file.JPG" -T -N
    

    그 이유는 바로 파일의 시작 부분에 접두사 길이를 넣어 BCP입니다. 그것은 하나 4 바이트 또는 8 바이트이다 포함한 FileContent 컬럼 (텍스트, NTEXT, 화상의 데이터 형식에 따라 4 VARCHAR (최대), VARBINARY (최대) : 8 참조 https://msdn.microsoft.com/en-us /library/ms190779.aspx)

    접두사 바이트를 제거하기 위해, 비주얼 스튜디오에서 같은 바이너리 편집기를 사용하여, 모든 것이 완벽하게 실행됩니다. :-)

  5. ==============================

    5.당신이 linqpad있는 경우이 작동합니다 :

    당신이 linqpad있는 경우이 작동합니다 :

    void Main()
    {
        var context = this;
        var query = 
            from ci in context.Images
            where ci.ImageId == 10
            select ci.Image
        ;
        var result = query.Single ();
        var bytes = Convert.FromBase64String(result);
        File.WriteAllBytes(@"c:\image.bmp", bytes);
    }
    
  6. ==============================

    6.그냥 대안. 당신은 SQL 서버의 프리웨어 두꺼비를 사용하고 편집기에서 직접 저장할 수 있습니다.

    그냥 대안. 당신은 SQL 서버의 프리웨어 두꺼비를 사용하고 편집기에서 직접 저장할 수 있습니다.

    당신은 자신의 웹 사이트 https://www.toadworld.com에 가서 거기에 프리웨어 또는 정식 버전의 30 일 평가판을받을 수 있습니다. 그 아래 다운로드 및 SQL 서버에 대한 두꺼비을 선택합니다.

    당신은 당신이 저장하고자하는 이미지가 라인에 두꺼비의 일반 select 문을. 당신이 결과를 볼 때,이 PDF 문서의 경우 바이트 이미지 열을 그리고 당신은 PDF 탭이 표시 오른쪽 클릭하거나 당신이 이미지 탭을 볼 남아 있습니다. 당신이 탭을 클릭하면 이미지 나 파일을 저장하기 위해 하단에 로고 저장을 볼 수 있습니다.

  7. ==============================

    7.SQL은 다른 존재하지 않습니다 그래서보기 무엇이든 그것의 관점에서, 데이터베이스 개체 작동하도록 설계되었습니다. 물론, 거기에 운영 체제와 상호 작용을 할 수 xp_cmdshell을 같은 확장 절차는하지만, 그들은 독점적 인 확장이 아닌 T-SQL의 일부입니다.

    SQL은 다른 존재하지 않습니다 그래서보기 무엇이든 그것의 관점에서, 데이터베이스 개체 작동하도록 설계되었습니다. 물론, 거기에 운영 체제와 상호 작용을 할 수 xp_cmdshell을 같은 확장 절차는하지만, 그들은 독점적 인 확장이 아닌 T-SQL의 일부입니다.

    아마 가장 가까운 방법은 폴더에 파일로 직접 일부 열을 저장하는 대신 데이터베이스를 사용하는 수 SQL 서버 2008의 바이너리 유형에 대한 FILESTREAM 특성을 사용하는 것입니다 :

    FILESTREAM 개요

    노트

  8. from https://stackoverflow.com/questions/4056050/script-to-save-varbinary-data-to-disk by cc-by-sa and MIT license