【问题标题】:Null value stored when fetching binary data获取二进制数据时存储的空值
【发布时间】:2016-08-05 12:56:10
【问题描述】:

我有一个表 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<=@propertyCount)       
     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

任何想法为什么会发生这种情况以及如何解决?

【问题讨论】:

  • 1k 个文件中有多少 插入了 NULL?
  • @tale852150: 可以是任意数量的行,1 或超过 1..

标签: sql sql-server varbinary


【解决方案1】:

我假设 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<=@propertyCount)       
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]

【讨论】:

  • 这对我也不起作用 :( 这停止将任何文件转换为二进制文件。
  • 你试过这个脚本吗?它在您的服务器上产生相同的结果吗?
  • 是的,我试过了,现在每个文件的 null 都存储在表中。
  • 我没有要求insert。我问SELECT。尝试在您的 insert 之前插入以下代码:PRINT '@ID = ' + IsNull(CAST(@ID AS VARCHAR),'NULL') + ' @Content = ' + IsNull(CAST(@Content AS VARCHAR),'NULL') 并查看它会给您带来什么结果。将其与插入的内容进行比较。
猜你喜欢
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
相关资源
最近更新 更多