将XML数据读入SQL Server表

时间:2018-11-22 20:38:42

标签: sql-server xml xml-parsing

我有这样的xml(包含超过300k):

<?xml version="1.0" encoding="utf-8"?>
<data>
  <kitap>
    <Adi>Matematik +5 Yaş</Adi>
    <Barkod>9786052342046</Barkod>
    <Resim>http://xxxx.com.tr/Icerik/Gorsel/Urun/9786052342046.jpg</Resim>
  </kitap>
  <kitap>
    <Adi>Broke - Light (Ciltli)</Adi>
    <Barkod>9786057944085</Barkod>
    <Resim>http://xxx.com.tr/Icerik/Gorsel/Urun/9786057944085.jpg</Resim>
  </kitap>
</data>

我想将数据存储到数据库表中。

这是我的T-SQL代码:

INSERT INTO ddd (Adi,Barkod,Resim) 
    SELECT 
        X.kitap.query('Adi').value('.', 'nvarchar(1000)'),
        X.kitap.query('Barkod').value('.', 'nvarchar(1000)'),
        X.kitap.query('Resim').value('.', 'nvarchar(1000)')
    FROM 
        (SELECT 
             CAST(x AS XML)
         FROM 
             OPENROWSET(BULK 'C:\sil\b.xml', SINGLE_BLOB) AS T(x)
        ) AS T(x)
CROSS APPLY 
    x.nodes('data/kitap') AS X(kitap);

但我收到此错误:

  

8152消息,第16级,状态13,第1行
  字符串或二进制数据将被截断。

1 个答案:

答案 0 :(得分:2)

好吧,尽管我稍微简化了一下,但您的XML查询很好:

DECLARE @xml XML=
'<?xml version="1.0" encoding="utf-8"?>
<data>
  <kitap>
    <Adi>Matematik +5 Yaş</Adi>
    <Barkod>9786052342046</Barkod>
    <Resim>http://xxxx.com.tr/Icerik/Gorsel/Urun/9786052342046.jpg</Resim>
  </kitap>
  <kitap>
    <Adi>Broke - Light (Ciltli)</Adi>
    <Barkod>9786057944085</Barkod>
    <Resim>http://xxx.com.tr/Icerik/Gorsel/Urun/9786057944085.jpg</Resim>
  </kitap>
</data>';

SELECT 
    X.kitap.value('(Adi/text())[1]', 'nvarchar(1000)'),
    X.kitap.value('(Barkod/text())[1]', 'nvarchar(1000)'),
    X.kitap.value('(Resim/text())[1]', 'nvarchar(1000)')
FROM @xml.nodes('data/kitap') AS X(kitap);

所提到的错误(“字符串或二进制数据将被截断” )的原因可能与目标字段的长度有关。您将所有三列都读为nvarchar(1000)。使用以下命令查找每列的最大长度:

SELECT 
    MAX(LEN(X.kitap.value('(Adi/text())[1]', 'nvarchar(max)'))) AS MaxLenAdi,
    MAX(LEN(X.kitap.value('(Barkod/text())[1]', 'nvarchar(max)'))) AS MaxLenBarkod,
    MAX(LEN(X.kitap.value('(Resim/text())[1]', 'nvarchar(max)'))) AS MaxLenResim
FROM @xml.nodes('data/kitap') AS X(kitap);

现在检查ddd表的定义,如果值适合表列中的1)nvarchar(1000)和2)。

还有一件事要提到:您的XML文件声称是utf-8编码的。仅以SINGLE_BLOB读取可能会很危险...这会将文件作为字节流调用,并将每个单个字节作为字符。但是utf-8使用多字节代码对世界上所有存在的字符进行编码。这将导致垃圾数据或错误。

  • 尝试将其导入为SINGLE_CLOB字符LOB -不安全,但要好一些)
  • 尝试在utf-8支持下导入它(我认为自v2014 SP1起可用)
  • 使用外部工具将文件转换为utf-16(甚至更好:ucs-2

最后一个提示:很多时候XML文件声称具有特殊的编码(第一行声明<?xml ... encoding="xyz"?>。很多时候人们只是不知道这是什么,并且认为,这个-太棒了-必须在那里(“嗯...不知道...只是复制了模板...” 。)可能值得检查文件的实际编码。通常,建议您忽略该声明完全在SQL-Server中。