2016-08-05 7 views
0

SQL에 Id(bigint)DocumentContent(varbinary(MAX)) 열이있는 Employee 테이블이 있습니다.바이너리 데이터를 가져올 때 Null 값이 저장 됨

이제 XML을 사용하여 Employee 테이블에 레코드를 삽입하려고하면 1Kb보다 작은 파일에 대해 Null 값이 테이블에 저장됩니다. 파일 크기가 1Kb보다 크면 이진 데이터로 변환되고 데이터베이스에 저장됩니다.

<MyDocuments> 
    <Rows> 
    <Id>62</Id> 
    <Document_Content>104116116112584747495550464954464846495856485748471041161161129910810510111011646104116109108</Document_Content> 
    </Rows> 
</MyDocuments> 

및 저장 프로 시저

CREATE Procedure [dbo].[Proc_SaveDocuments] 
( 
@XMLData as XML 
) 
AS 
BEGIN 
Declare @propertyCount Varchar(100) = '',@currentCount int=1,@Id bigint,@Content varbinary(MAX) 
SELECT @propertyCount = convert(VARCHAR, @XMLData.query ('count(/MyDocuments/Rows)')) 
SET @currentCount = 1 
    WHILE (@currentCount<[email protected])  
    BEGIN 
    SET @Id = @XMLData.value('data(/MyDocuments/Rows[sql:variable("@currentCount")]/Id)[1]', 'BIGINT') 
    SET @Content = @XMLData.value('data(/MyDocuments/Rows[sql:variable("@currentCount")]/Document_Content)[1]', 'VARBINARY(MAX)') 

    insert into Employee values(@Id,@Content) --inserts null in DocumentContent column when file size less than 1Kb, else converts it to binary and saves it in database. 
    SET @currentCount = @currentCount + 1 
    END 
END 

어떤 아이디어 왜 이런 일이 어떻게이 문제가 해결 될 수입니다 다음과 같이 생성

내 XML은?

+0

얼마나 많은 ? – tale852150

+0

@ tale852150 : 행 수는 1이거나 1 이상이 될 수 있습니다. –

답변

0

나는 XML은 "VARBINARY"형식을 이해하지 못하는 가정

NULL을 삽입하는 1K 파일
DECLARE @XMLData XML = '<MyDocuments> 
    <Rows> 
    <Id>62</Id> 
    <Document_Content>104116116112584747495550464954464846495856485748471041161161129910810510111011646104116109108</Document_Content> 
    </Rows> 
    <Rows> 
    <Id>63</Id> 
    <Document_Content>654654654654546847435483797123954898327987329759873256327864929347623974311011646104116109108</Document_Content> 
    </Rows> 
</MyDocuments>' 

Declare @propertyCount Varchar(100) = '',@currentCount int=1,@Id bigint,@Content varbinary(MAX) 
SELECT @propertyCount = convert(VARCHAR, @XMLData.query ('count(/MyDocuments/Rows)')) 
SET @currentCount = 1 

SELECT @propertyCount = convert(VARCHAR, @XMLData.query ('count(/MyDocuments/Rows)')) 
SET @currentCount = 1 
WHILE (@currentCount<[email protected])  
BEGIN 

    SET @Id = @XMLData.value('data(/MyDocuments/Rows\[sql:variable("@currentCount")\]/Id)\[1\]', 'BIGINT') 
    SET @Content = CAST(@XMLData.value('data(/MyDocuments/Rows\[sql:variable("@currentCount")\]/Document_Content)\[1\]', 'VARCHAR(MAX)') as VARBINARY(MAX)) 

    SET @currentCount += 1 
    SELECT @Id,@Content 
END] 

enter image description here

+0

이 또한 나를 위해 작동하지 않습니다. ( 이 파일을 바이너리로 변환하는 작업이 중지되었습니다. –

+0

이 스크립트를 사용해 보셨습니까? –

+0

네, 이제 모든 파일에 대해 null을 테이블에 저장하려고 시도했습니다. –