Как я могу прочитать XML, переданный как экземпляр XmlReader на стороне хранимой процедуры?
Я следую предложению ответа .
Вот что я делаю на стороне C#:
this.Context.Database.ExecuteSqlCommandAsync(
"EXECUTE dbo.LegalContractorsDataSynchronize @data, @hashKey, @hash",
new SqlParameter("@data", SqlDbType.Xml)
{
Value = new SqlXml(value)
},
new SqlParameter("@hashKey", hashKey),
new SqlParameter("@hash", hash)
);
Вот что я делаю в хранимой процедуре:
CREATE PROCEDURE [dbo].[LegalContractorsDataSynchronize]
(@data xml,
@hashKey nvarchar(100),
@hash nvarchar(2048))
AS
BEGIN
BEGIN TRANSACTION
MERGE [dbo].[LegalContractors] AS TblTarget
USING (SELECT
[Code] = c.value('EDRPOU[1]', 'nvarchar(100)'),
[ShortName] = c.value('SHORT_NAME[1]', 'nvarchar(512)'),
[Name] = c.value('NAME[1]', 'nvarchar(2048)'),
[LegalAddress] = c.value('ADDRESS[1]', 'nvarchar(2048)'),
[Status] = c.value('STAN[1]', 'nvarchar(100)')
FROM
@data.nodes('/RECORD') AS T(c)) AS TblSource([Code], [ShortName], [Name], [LegalAddress], [Status])
ON (TblSource.Code = TblTarget.Code AND TblSource.[Status] = TblTarget.[Status])
WHEN NOT MATCHED BY TARGET THEN
INSERT ([Code], [ShortName], [Name], [LegalAddress], [Status])
VALUES (TblSource.[Code], TblSource.[ShortName], TblSource.[Name], TblSource.[LegalAddress], TblSource.[Status])
WHEN MATCHED THEN
UPDATE SET
TblTarget.[Code] = TblSource.[Code],
TblTarget.[ShortName] = TblSource.[ShortName],
TblTarget.[Name] = TblSource.[Name],
TblTarget.[LegalAddress] = TblSource.[LegalAddress],
TblTarget.[Status] = TblSource.[Status]
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
IF EXISTS(SELECT * FROM [StorageCaches] WHERE S_Key = @hashKey)
UPDATE [StorageCaches]
SET [S_Value] = @hash
WHERE S_Key = @hashKey
ELSE
INSERT INTO [StorageCaches] ([S_Key], [S_Value], [TenantId])
VALUES (@hashKey, @hash, 1);
COMMIT TRANSACTION
END
Пока ха sh обновлено, как ожидалось, объекты все еще не обновлены. Так, может быть, это как-то связано с обработкой xml на стороне хранимой процедуры?
Вот пример xml, который я использую для проверки своего кода:
<?xml version="1.0" encoding="windows-1251"?>
<DATA FORMAT_VERSION="1.0">
<RECORD>
<NAME>МІЖНАРОДНА ГРОМАДСЬКА ОРГАНІЗАЦІЯ МІЖНАРОДНА АКАДЕМІЯ БІОЕНЕРГОТЕХНОЛОГІЙ</NAME>
<SHORT_NAME>МАБЕТ</SHORT_NAME>
<EDRPOU>00011601</EDRPOU>
<ADDRESS>01001, м.Київ, Шевченківський район, ВУЛИЦЯ ПРОРІЗНА, будинок 8, офіс 426</ADDRESS>
<BOSS>ТКАЧЕНКО ВОЛОДИМИР АНДРІЙОВИЧ</BOSS>
<KVED>94.12 Діяльність професійних громадських організацій</KVED>
<STAN>зареєстровано</STAN>
<FOUNDERS>
<FOUNDER>Члени організації, розмір внеску до статутного фонду - 0.00 грн.</FOUNDER>
</FOUNDERS>
</RECORD>
<RECORD>
<NAME>фоо</NAME>
<SHORT_NAME>фоо короткое имя</SHORT_NAME>
<EDRPOU>47474747</EDRPOU>
<ADDRESS>фоо адрес</ADDRESS>
<BOSS>фоо бос</BOSS>
<KVED>фоо квед</KVED>
<STAN>фоо состояние</STAN>
<FOUNDERS>
<FOUNDER>фоо организатор</FOUNDER>
</FOUNDERS>
</RECORD>
</DATA>
Также я попытался отладить свою хранимую процедуру. Я следовал предложениям в этом вопросе. Я проверил Enable SQL Server debugging
для проекта, который вызывает C# SP. Кроме того, я нашел хранимую процедуру в SQL Обозревателе объектов сервера и проверил как Отладку приложений, так и Разрешить отладку SQL / CLR, но все же точка останова в хранимой процедуре отключена, и при наведении на нее указателя говорит мне:
Точка останова в настоящее время не будет достигнута. Для этого документа не было загружено ни одного символа.
![enter image description here](https://i.stack.imgur.com/qBZQo.png)
Т.е. для устранения проблемы мне нужен другой способ обработки xml на стороне хранимой процедуры, или способ включить отладку в Visual Studio (также у меня есть SQL Server Management Studio, я также попытался отладить вызов SP, но безуспешно, и я считаю, что намного проще сделать это непосредственно в Visual Studio) или что-то еще (я не в курсе, но вы можете порекомендовать).
В двух словах: когда я пытаюсь вставить пример данных с помощью процедуры, представленной выше, данные не вставляются (соответствующая таблица остается пустой).