Как я могу прочитать 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, но все же точка останова в хранимой процедуре отключена, и при наведении на нее указателя говорит мне:
Точка останова в настоящее время не будет достигнута. Для этого документа не было загружено ни одного символа.
Т.е. для устранения проблемы мне нужен другой способ обработки xml на стороне хранимой процедуры, или способ включить отладку в Visual Studio (также у меня есть SQL Server Management Studio, я также попытался отладить вызов SP, но безуспешно, и я считаю, что намного проще сделать это непосредственно в Visual Studio) или что-то еще (я не в курсе, но вы можете порекомендовать).
В двух словах: когда я пытаюсь вставить пример данных с помощью процедуры, представленной выше, данные не вставляются (соответствующая таблица остается пустой).