0

在我的一个 c# 项目中,我必须在数据库表中存储多行。为此,我在存储过程中将 Xml 数据作为字符串数据类型传递,然后我改回 XML,然后使用 sp_xml_prepareddocument 存储到表中。

我想知道这是否是正确的方法。或者是否有任何其他最佳方法可用于处理这种情况。当 XML 变大时是否有任何性能损失。

ALTER PROCEDURE [dbo].[InsertData]
 @nSiteId int,
 @nClaimId int,
 @nEditSourceId int,
 @sClaimEditXml NVARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON

    DECLARE @hDoc INT, @nRC INT  
    EXEC @nRC = sp_xml_preparedocument @hDoc OUTPUT, @sClaimEditXml  
    IF @nRC <> 0  
    BEGIN  
        RAISERROR( N'apiInsertClaimCurrentEdits #1', 16, -1 )  
        RETURN -1  
    END

    IF EXISTS(SELECT * from ClaimCurrentEdits where SiteID=@nSiteId and ClaimID=@nClaimId and EditSourceId = @nEditSourceId)
    BEGIN
        DELETE FROM ClaimCurrentEdits where SiteID=@nSiteId and ClaimID=@nClaimId and EditSourceId = @nEditSourceId 
    END

    INSERT INTO [ClaimCurrentEdits]
   ([SiteID]
   ,[ClaimID]
   ,[ErrorID]           
   ,[ErrorDesc]
   ,[Severity]
   ,[ValidationDate]
   ,[EditSourceId]
   )     
    SELECT * FROM OPENXML( @hDoc, '/ValidationResults/ValidationResult',2 )
    WITH
    (   SiteId int '../@SiteId',
        ClaimId int '../@ClaimId',
        ErrorId int '@ErrorId',
        ErrorDesc varchar(2048) '@ErrorDesc',
        Severity int '@Severity',
        ValidationDate datetime '@ValidationDate',
        EditSourceId int '@EditSourceId'
    )   

    EXEC sp_xml_removedocument @hDoc

END

RETURN 0

/******************************************************************************/

GO
4

1 回答 1

0

如果您的 xml 文件较大,那么只要您确保在完成后立即运行 sp_xml_removedocument,OpenXML 就是您的选择。如果您要在 xml 上看到更小的块,我认为 XQuery 更快,并且不会带来任何来自 sp_xml_preparedocument 的内存问题。

我一直发现,根据您的需要尝试使用有效大小的 xml 的两种方法是最好的方法。

于 2012-07-24T03:05:20.070 回答