Считайте XML, переданный как экземпляр XmlReader на стороне хранимой процедуры. - PullRequest
0 голосов
/ 17 февраля 2020

Как я могу прочитать 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

Т.е. для устранения проблемы мне нужен другой способ обработки xml на стороне хранимой процедуры, или способ включить отладку в Visual Studio (также у меня есть SQL Server Management Studio, я также попытался отладить вызов SP, но безуспешно, и я считаю, что намного проще сделать это непосредственно в Visual Studio) или что-то еще (я не в курсе, но вы можете порекомендовать).

В двух словах: когда я пытаюсь вставить пример данных с помощью процедуры, представленной выше, данные не вставляются (соответствующая таблица остается пустой).

...