Проблема передачи XML-файла в параметр хранимой процедуры SQL Server из PowerShell - PullRequest
0 голосов
/ 20 сентября 2018

Я сталкиваюсь с несколькими проблемами при попытке вызвать хранимую процедуру из PowerShell, которая ожидает входной параметр типа XML.Пример XML-файла выглядит следующим образом (обратите внимание, что для этого теста требуется тег utf-8, потому что это то, что находится в моих реальных XML-файлах, являющихся формами InfoPath):

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

Хранимая процедура теста выглядит следующим образомthis:

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 не может переключить кодировку.Затем я пробую третье значение $str, которое переключило utf-8 на utf-16 (и отправляет в виде строки), и это работает.Но моя таблица получает только корневой узел <Root><Person><Name>Simon</Name><Age>20</Age></Person></Root>, и мне нужен весь файл, включая заголовок.Я подтвердил, что заголовок находится в строковой переменной, поэтому я не уверен, почему он теряется между PowerShell и SQL.

Во-первых, я хотел бы получить подтверждение того, что я прав, и этот параметр должен быть строкой при отправке данных из PowerShell.Во-вторых, я бы подтвердил, что мне нужно выполнить замену строки для информации utf, чтобы отправить файл в SQL.В-третьих, я хотел бы знать, как получить все содержимое файла, хранящееся в SQL, чтобы в него также включалась информация заголовка определения xml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...