2016-08-05 61 views
0

我有一个表Employee,其中SQL列中的列为Id(bigint)DocumentContent(varbinary(MAX))提取二进制数据时存储的空值

现在,当我尝试在使用XML的Employee表中插入记录时,Null值存储在大小小于1Kb的文件的表中。当文件大小大于1Kb时,它将被转换为二进制数据并存储在数据库中。产生

我的XML如下:

<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 

任何想法,为什么会出现这种情况,如何可以这样解决?

+0

多少在被插入空1K的文件? – tale852150

+0

@ tale852150:它可以是任意数量的行,1或多于1 .. –

回答

0

我认为XML不明白 “VARBINARY” 格式:

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都存储在表中。 –