0

请参阅下面的示例存储过程代码,它不是完整的代码库,因为它很大。

我正在将几个 xml 数据片段从我的 C# 应用程序传递到存储过程,并且传递它们需要很长时间。

在存储过程中,我从每个 xml 参数中提取数据并将该数据插入到多个表中,然后加入许多物理表并将结果存储到临时表中。最后从最终临时表返回数据。

我的问题是为什么将多个巨大的 xml 数据片段传递给存储过程需要很长时间。

如何诊断这个问题以知道哪个需要很长时间以及在哪里滞后?我需要诊断是 C# 需要很长时间来调用我的存储过程,还是该过程需要很长时间?

告诉我将多个巨大的 XML 数据片段传递给存储过程的最佳方法。我正在从后台工作人员do_work事件中调用我的存储过程 - 这是长时间运行的原因吗?

谢谢

CREATE PROCEDURE [dbo].[USP_InsertDataFromXML]
    (@Ticker VARCHAR(50),
     @PCName VARCHAR(50),
     @LiconfigXML XML,
     @10QKXML XML,
     @CustomFormula XML,
     @Comments XML,
     @ToggleData XML,
     @BrokerHistoryOptionXML XML,
     @BrokerGridXML XML,
     @PrevEarningXML XML,
     @BrokerBogey NVARCHAR(MAX),
     @PeriodListXML XML,
     @existHist VARCHAR(10),
     @existHistFY VARCHAR(10),
     @lblEarning VARCHAR(10))
AS
BEGIN
    SET @t1 = GETDATE();

    DELETE FROM [tblTenQKBogey] WHERE PCName = @PCName

    IF (@10QKXML IS NOT NULL) 
    BEGIN
        INSERT INTO [tblTenQKBogey] (Section, LineItem, XFundCode, PCName)
            SELECT
                TenQK.detail.value('(Section/text())[1]','VARCHAR(MAX)') AS Section, 
                TenQK.detail.value('(LineItem/text())[1]','VARCHAR(MAX)') AS LineItem, 
                TenQK.detail.value('(xFundCode/text())[1]','VARCHAR(MAX)') AS xFundCode,
                @PCName AS PCName
            FROM  
                @10QKXML.nodes('/Bogeylist/BrokerData') AS TenQK(detail) 
        END

        SET @t2 = GETDATE();

        SELECT @timetaken = CAST(DATEDIFF(millisecond, @t1, @t2) AS VARCHAR(20))

        SELECT @DataCount = COUNT(*) FROM [tblTenQKBogey]

        INSERT INTO tblQcLog (Action, Info, TimeTaken, PCName, TableDataCount, Ticker)
        VALUES ('INSERT INTO [tblTenQKBogey] table',
                'dumping data from xml',
                @timetaken, @PCName, @DataCount, @Ticker)
    END
END
4

0 回答 0