SQL Server에서 이미지 열을 파일로 내보내는 방법은 무엇입니까?


13

데이터베이스에서 마이그레이션합니다. image파일 시스템의 이진 파일로 내보내려는 유형의 열이 하나 있습니다. 각 레코드 당 하나의 파일. SQL Server에서이 작업을 어떻게 수행 할 수 있습니까?



답변:


13

이것이 내가 생각해 낸 해결책입니다.

  1. 사용 xp_cmdshell하여

    EXEC sp_configure 'show advanced options', 1
    GO
    RECONFIGURE
    GO
    EXEC sp_configure 'xp_cmdshell', 1
    GO
    RECONFIGURE
    GO
  2. 필요한 경우 필요한 xp_cmdshell권한을 얻을 수있는 디렉토리를 만듭니다 .

    EXEC master..xp_cmdshell 'mkdir C:\exportdir'
  3. queryout과 함께 BCP 사용

    EXEC master..xp_cmdshell 'BCP "SELECT column_of_type_image FROM **your_db WHERE id = 1 " queryout "C:\exportdir\yourfile.pdf" -T -N'

** your_db는 정규화 된 테이블 이름이어야합니다 (예 : [Yourdb]. [YourSchema]. [YourTable]).


1
위의 코드를 시도했지만 실제로 작동했습니다 ... 어떤 이유로 JPG 이미지에는 유효하지 않은 4 개의 선행 문자가 있습니다. 나는 텍스트 편집기와 voila ... JPG로 제거했습니다. 이 4 개의 캐릭터가 무엇인지, 그리고 익스포트에서 어떻게 제거 할 수 있을지 아십니까? 그들은 :2B 90 01 00

내 보낸 열의 유형은 무엇입니까?
Max Vernon

10

여분의 4 바이트가 모든 파일의 시작 부분에 추가되는 것과 동일한 문제가있었습니다. bcp 명령에서 -N 옵션을 사용하는 대신 -C RAW로 변경했습니다. 이렇게하면 bcp에 다음 질문이 표시됩니다.

FileData [image] 필드의 파일 저장 유형을 입력하십시오.
FileData [4] 필드의 접두사 길이를 입력하십시오.
FileData [0] 필드 길이를 입력하십시오.
필드 종결 자 입력 [없음] : 
이 형식 정보를 파일로 저장 하시겠습니까? [Y / n]

이 문제를 해결하기 위해 SQL 서버의 루트에 텍스트 파일 (i.txt)을 만들었습니다.

나는
0
0

엔

그런 다음 EXEC bcp 줄은 다음과 같습니다.

EXEC master..xp_cmdshell 'BCP "SELECT column_of_type_image FROM ** your_db WHERE id = 1"queryout "C : \ exportdir \ yourfile.pdf"-T -C RAW <C : \ i.txt'

여분의 문자없이 내 파일을 내보냈습니다.


2

다른 종류의 파일 형식 (pdf, xls, doc, xml ...)을 저장 한 이미지 열을 내보내는 솔루션을 찾고 있습니다.

답변의 접근 방식은 pdf 파일에서만 작동했습니다. 모든 종류의 파일을 내보내려면 다음과 같이 솔루션을 조정해야했습니다.

(1) 형식 템플릿 파일을 만듭니다.

Declare @sql varchar(500); 
Declare @sql varchar(500); 
SET @sql = 'bcp db.dbo.ImgTable format nul -T -n -f C:\tmp\export.fmt -S ' + @@SERVERNAME; 
select @sql;  
EXEC master.dbo.xp_CmdShell @sql; 

(2.) 작성된 내보내기 형식 파일을 열고 다음과 같이 편집하십시오.

10.0
1
1       SQLIMAGE            0       0       ""   1     img_col                                     ""

그런 다음 내보내기 명령을 실행하십시오.

EXEC master..xp_cmdshell 'BCP "SELECT IMG_COL FROM db.dbo.ImgTable WHERE id = ''CAB240C0-0068-4041-AA34-0000ECB42DDD'' " queryout "C:\tmp\myFile.xml" -T -f C:\tmp\export.fmt -S '

(3.)이 오류가 발생하는 경우 (내가했던 것처럼) :

"[Microsoft] [SQL Native Client] 호스트 파일 열은 서버로 복사 할 때만 건너 뛸 수 있습니다"

다음을 확인하십시오.

  • 두 번째 행을 편집하고 여기에 항목 수를 입력하십시오 (이 시나리오에서는 1).
  • 마지막 줄의 끝에 CRLF가 있는지 확인하십시오. 이것 없이는 작동하지 않습니다!

그런 다음 오류없이 IMAGE Column 파일 단어를 내 보냅니다.

1.과 2. 모든 공물가 다음과 같은 질문의 답에 간다 : /programming/1366544/how-to-export-image-field-to-file/24006947#24006947


1

GUI 솔루션에 아무런 문제가 없다면 SSMS SSMSBoost 에 대한 훌륭한 추가 기능이 있습니다.이 기능은 유용한 기능을 많이 제공하며 SQL에 저장된 이미지를 미리 보는 가장 간단한 방법입니다 (적어도 내 의견으로는)

참고 :이 애드 인을 설치 한 후 SSMS를 다시 시작해야합니다.

마우스 오른쪽 버튼으로 클릭> 다른 이름으로 시각화> 그림으로 이미지를 미리보고 미리보기를 즐기십시오.


0
EXEC master..xp_cmdshell 'mkdir D:\Project\Member\Images'

ONE LINE-Single LINE에서 명령을 유지하십시오 !!!

SET @Command = 'bcp "SELECT Member_Picture FROM dbserver.[Member_Image] WHERE memberId = 1 " queryout "D:\Project\Member\Images\member1.jpg" -T -N ' 
PRINT @Command -- debugging
EXEC xp_cmdshell   @Command
GO

xp_cmdshell을 비활성화하고 당신이 얻을 일부 서버에서SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', search for 'xp_cmdshell' in SQL Server Books Online.
JustAMartin

-2
USE [POC]
DECLARE @outPutPath varchar(50) = 'C:\Extract_Photos'
, @i bigint
, @init int
, @data varbinary(max)
, @fPath varchar(max)
, @folderPath  varchar(max)

--Get Data into temp Table variable so that we can iterate over it
DECLARE @Doctable TABLE (id int identity(1,1), [Doc_Num]  varchar(100) , [FileName]  varchar(100), [Doc_Content] varBinary(max) )

INSERT INTO @Doctable([Doc_Num] , [FileName],[Doc_Content])
Select [STUDENTNO] , [STUDENTNAME],[STUDENTPHOTO] FROM  [dbo].[STUDENTPHOTOS]

--SELECT * FROM @table

SELECT @i = COUNT(1) FROM @Doctable

WHILE @i >= 1
BEGIN

    SELECT
     @data = [Doc_Content],
     @fPath = @outPutPath + '\'+ [Doc_Num] + '\' +[FileName],
     @folderPath = @outPutPath + '\'+ [Doc_Num]
    FROM @Doctable WHERE id = @i

  --Create folder first
  EXEC  [dbo].[CreateFolder]  @folderPath

  EXEC sp_OACreate 'ADODB.Stream', @init OUTPUT; -- An instace created
  EXEC sp_OASetProperty @init, 'Type', 1;
  EXEC sp_OAMethod @init, 'Open'; -- Calling a method
  EXEC sp_OAMethod @init, 'Write', NULL, @data; -- Calling a method
  EXEC sp_OAMethod @init, 'SaveToFile', NULL, @fPath, 2; -- Calling a method
  EXEC sp_OAMethod @init, 'Close'; -- Calling a method
  EXEC sp_OADestroy @init; -- Closed the resources

  print 'Document Generated at - '+  @fPath

--Reset the variables for next use
SELECT @data = NULL
, @init = NULL
, @fPath = NULL
, @folderPath = NULL
SET @i -= 1
END

이 코드의 기능을 설명하여 게시물을 수정하십시오.
dezso

스크립트가 훌륭하게 작동 한 Erax에 감사드립니다. PS : SSMS를 사용하여 원격으로 실행 한 경우 스크립트가 파일을 추출하지 못합니다. 첨부 파일을 가져 오려면 SQLServer에서 직접 실행해야했습니다.
Vaas 2019
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.