2016-09-01 8 views
0

plots 테이블에 이미지 파일의 이진 데이터를 저장하는 열이 plot 인 테이블이 있습니다. R 스크립트를 호출하고 삽입 할 데이터의 데이터 프레임을 가져 오는 T-SQL 쿼리를 실행하고 있습니다. 데이터 프레임은 다음과 같습니다.R 스크립트에서 SQL Server VARBINARY 열에 삽입

plot  name date_from date_to 
1 ABCDEF plot1 2016-08-25 2016-08-31 
2 AAAAAA plot2 2016-08-25 2016-08-31 

알 수 있듯이 플롯 열에는 원시 데이터가 이미 포함되어 있습니다.

명확히하기 위해 데이터 프레임에 데이터가있는 데이터베이스에 두 행을 삽입하는 것으로 데이터 프레임 열 이름이 데이터베이스 열과 일치합니다.

내가

INSERT INTO dbo.plots 
EXECUTE sp_execute_external_script 
    @language = N'R' 
    ,@script = N'source("path/to/r/script.R")' 
    ,@output_data_1_name = N'output_dataset' 

으로 받고 있어요 문제는 "허용되지 않습니다 VARBINARY (최대)로 데이터 형식 NVARCHAR (최대)에서 암시 적 변환.이 쿼리를 실행하려면 CONVERT 함수를 사용하여"입니다.

그러나이 오류를 어떻게 해결할 수 있는지 잘 모르겠습니다. CONVERT 기능은 어디에 두어야합니까? 아니면 다른 방법이 있습니까?

+0

클래스가 일치합니까? 다음을 참조하십시오 : https://msdn.microsoft.com/en-us/library/mt590948.aspx –

+0

대량으로 삽입 한 다음 임시 테이블에서 테이블 삽입으로 변환 할 수 있습니다. – scsimon

+0

@ PawełDyl 흠, 16 진수 표현이 있습니다. 그냥 문자열, 즉 "ABCDEF" – clb

답변

2

SQL Server R 서비스의 경우 문자 유형이 VARCHAR로 매핑되고 원시 유형이 VARBINARY (Working with R Data Types 참조)로 매핑됩니다. 데이터를 VARBINARY로 저장하려면 16 진수 문자열을 원시 바이트로 변환해야하며 R 또는 SQL에서 수행 할 수 있습니다. 다음은 임시 테이블 (scimon의 의견에서 영감을받은)을 사용하여 SQL로 변환 한 예입니다.

CREATE TABLE #test 
(
    [data] VARBINARY(MAX), 
) 


CREATE TABLE #temp 
(
    [data] VARCHAR(MAX), 
) 

INSERT INTO #temp 
EXEC sp_execute_external_script 
@language=N'R', 
@script=N'OutputDataSet <- as.data.frame("ABCDEF")' 

INSERT INTO #test SELECT CONVERT(VARBINARY(MAX), data, 2) FROM #temp; 
+0

고마워요, 지금 이걸 시험 할 수는 없지만 유망한 것 같습니다! 내일 다시 너에게 갈거야. 이 목적을 위해 데이터베이스 스키마에 임시 테이블을 만들어야합니까, 아니면 임시 테이블을 "즉석에서"만들 수있는 SQL Server의 기능입니까? – clb

+1

안녕하세요,이 사실이 완벽하게 작동되었음을 알려드립니다. 고맙습니다! – clb

0

불행히도 내 버전의 SQL Server는 사용자가 수행하는 모든 멋진 R 작업을 수행하지 않습니다. 그래서 내가 제공 할 수있는 가장 좋은 것은 바이너리 데이터를 테이블로 성공적으로 가져올 수있는 R 스크립트이며 필요한 수정 작업을 수행 할 수 있기를 바랍니다. 내가

로 정의 SQL Server에서 테이블을 사용하고

CREATE TABLE [dbo].[InsertFile](
    [OID] [int] IDENTITY(1,1) NOT NULL, 
    [filename] [varchar](50) NULL, 
    [filedata] [varbinary](max) NULL 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

GO 

내 R 스크립트는

library(RODBCext) 
library(magrittr) 

# My example just grabs all the text files out of a directory, 
# but as long as you have the full filename, this will work. 

file_name <- list.files([directory_to_files], 
         pattern = "[.]txt$", 
         full.names = TRUE) 

file_content <- 
    vapply(
    file_name, 
    function(x) 
    { 
     # read the binary data from the file 
     readBin(x, 
       what = "raw", 
       n = file.info(x)[["size"]]) %>% 
     # convert the binary data to a character string suitable for import 
     as.character() %>% 
     paste(collapse = "") 
    }, 
    character(1) 
) 

channel <- odbcConnect(...) # Create your connection object here 

sqlExecute(
    channel = channel, 
    query = paste0("INSERT INTO dbo.InsertFile ", 
       "(filename, filedata) ", 
       "VALUES ", 
       "(?, ?)"), 
    data = list(filename = basename(file_name), 
       filedata = file_content) 
) 

는 해당 스크립트를 실행 한 후에, 나는 각 파일에 대해 내 dbo.InsertFile 테이블에 새 라인을 가지고있다 file_name.

+0

나는 이것을 사용하여 SQL 서버에 pdf 파일을 저장하려고합니다. 'Calloc'이 메모리를 할당 할 수 없습니다 (2147483648 1 바이트) – John