【问题标题】:XML parsing error while inserting XML to SQL Server将 XML 插入 SQL Server 时出现 XML 解析错误
【发布时间】:2018-03-17 21:26:42
【问题描述】:

我正在编写一个简单的 powershell 脚本,将 XML 文件从文件夹插入 SQL Server 2012。但每次尝试插入 XML 时都会失败,并出现以下错误。在 Microsoft 文档中,他们正在插入 UTF-8 编码的 xml。当我手动将编码更改为“UTF-16”时,我能够插入 XML 数据。我需要做的是在不更改 UTF-8 编码的情况下插入 XML。谢谢。

错误:

使用“0”参数调用“ExecuteScalar”的异常:“XML 解析:第 1 行,字符 38,无法切换编码”

线

$InsertedID = $sqlCommand.ExecuteScalar()

表定义:

CREATE TABLE TESTXML
(
     ID INT IDENTITY(1,1) NOT NULL,
     FileName VARCHAR(200),
     InsertedDate DATETIME DEFAULT GETDATE(),
     InsertedBy   VARCHAR(100) DEFAULT 'PS',
     XML XML,
     BLOB VARBINARY(MAX)
)

要解析的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<order xmlns="http://XXXXX/xml/impex/XXX/2006-10-31" order-no="XXX">
XML Data......
</order>

Powershell 脚本:

foreach($xmlfile in $xmlfiles){
   [string]$xml = (Get-Content $xmlfile.FullName) -replace "'", "''"
    $sqlCommand.Parameters[0].Value = $xmlfile.FullName
    $sqlCommand.Parameters[1].Value = $xml 
    $InsertedID = $sqlCommand.ExecuteScalar()
    "Inserted row ID $InsertedID for file " + $xmlfile.FullName
}

【问题讨论】:

    标签: .net sql-server xml powershell encoding


    【解决方案1】:

    SQL Server 将 XML 处理为 unicode / UCS-2(与 utf-16 非常相关)。 Powershell 将字符串作为 2 字节编码的字符串发送,因此 encoding="UTF-8" 没有说实话。这就是它抱怨的原因......

    您有多种选择:

    • 使用 ((Get-Content $xmlfile.FullName) -replace "'", "''") -replace "UTF-8","UTF-16" 之类的东西在您的 powershell 代码中更改此权限。
    • 使用 Powershell 完全切断声明(只需发送不带 &lt;?xml ...?&gt; 的 XML)
    • 创建一个接受NVARCHAR(MAX) 的存储过程并使用T-SQL 更改编码或删除声明。
    • 在 SQL-Server 中使用一个暂存表来接受 NVARCHAR(MAX) 列中的 XML,然后在第二步中将导入的数据传输到目标表。 (在许多情况下,暂存表对于更大的导入场景来说是个好主意)

    祝你好运

    【讨论】:

    • 谢谢俊哥。我会尝试前两个步骤并告诉你。
    • 我尝试了第一个选项,效果很好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    相关资源
    最近更新 更多