Я сталкиваюсь с несколькими проблемами при попытке вызвать хранимую процедуру из 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.