我有这样的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行
字符串或二进制数据将被截断。
答案 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中。