从PowerShell

时间:2018-09-20 15:58:08

标签: sql-server xml powershell encoding

尝试从PowerShell调用输入参数为XML类型的存储过程时遇到一些问题。示例XML文件如下所示(请注意,此测试需要utf-8标记,因为这就是我真正的XML文件(即InfoPath表单)中的内容)

<?xml version="1.0" encoding="utf-8"?>
<Root>
      <Person>
            <Name>Simon</Name>
            <Age>20</Age>
      </Person>
</Root>

测试存储过程如下:

CREATE PROCEDURE [dbo].[sp_test_load_xml]
    (@xmldata XML)
AS
BEGIN
    INSERT INTO [dbo].[t_test_xml_files] ([XMLData]) 
    VALUES (@xmldata)
END

我的PowerShell测试如下:

[xml]$xmldoc = Get-Content 'C:\test_file.xml'
[string]$str =  $xmldoc.OuterXML.Replace('<?xml version="1.0" encoding="utf-8"?>','<?xml version="1.0" encoding="utf-16"?>')

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=.\sql2017;Database=testdb;Integrated Security=True" 

$sqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.Connection = $SqlConnection
$sqlCmd.CommandText = "dbo.sp_test_load_xml"
$sqlCmd.CommandType=[System.Data.CommandType]'StoredProcedure'

$sqlCmd.Parameters.Add("@xmldata",[System.Data.SqlDbType]::xml) | Out-Null

#$sqlCmd.Parameters["@xmldata"].Value = $xmldoc;
#$sqlCmd.Parameters["@xmldata"].Value = $xmldoc.OuterXML;
#$sqlCmd.Parameters["@xmldata"].Value = $str;

$SqlConnection.Open()
$RowsEffected = $sqlCmd.ExecuteNonQuery()
$SqlConnection.Close()

请注意,在代码中,我有3条注释行用于设置参数值。首先,我不确定为什么,但是通过传递$xmldoc变量失败,原因是它无法将XmlDocument转换为字符串。因此,我假设SQL需要一个字符串。第二个测试使用$xmldoc.OuterXML,但无法说明XML解析无法切换编码。因此,然后我尝试将{utf-8切换为utf-16(并作为字符串发送)的$str的第三个值,此方法可以正常工作。但是我的表仅获取根节点<Root><Person><Name>Simon</Name><Age>20</Age></Person></Root>,并且我需要整个文件,包括标题。我已经确认标头在字符串变量中,所以我不确定为什么在PowerShell和SQL之间会丢失标头。

首先,我想确认我是正确的,并且从PowerShell发送数据时该参数必须为字符串。其次,我确认需要对utf信息执行字符串替换,以便将文件发送到SQL。第三,我想知道如何获取存储在SQL中的整个文件内容,因此还包括xml定义头信息。

0 个答案:

没有答案