2016-08-05 1 views
0

J'ai une table Employee avec les colonnes Id(bigint) et DocumentContent(varbinary(MAX)) dans SQL.Valeur nulle stockée lors de l'extraction de données binaires

Maintenant, lorsque j'essaie d'insérer des enregistrements dans la table Employee en utilisant XML, la valeur Null est stockée dans la table pour les fichiers dont la taille est inférieure à 1Kb. Lorsque la taille du fichier est supérieure à 1Kb, il est converti en données binaires et stocké dans la base de données.

Mon XML généré est la suivante:

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

et procédure stockée est

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 

Toutes les idées pourquoi est-ce qui se passe et comment cela peut-il être résolu?

+0

Combien de dans les fichiers 1k qui sont NULL Insertion? – tale852150

+0

@ tale852150: Il peut être n'importe quel nombre de lignes, 1 ou plus de 1 .. –

Répondre

0

Je suppose que XML ne comprend pas le format "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

cela n'a pas fonctionné pour moi :( Cela a arrêté de convertir n'importe quel fichier en binaire –

+0

Avez-vous essayé ce script? le même résultat sur votre serveur? –

+0

oui je l'ai essayé, maintenant pour chaque fichier nul est stocké dans la table –