2012-07-23 45 views
0

在我的一個C#項目中,我必須在數據庫表中存儲多行。爲此,我在存儲過程中將Xml數據作爲字符串數據類型傳遞,然後將其更改回XML,然後使用存儲在表中的sp_xml_prepareddocument。在SQL Server中處理XML輸入參數的最佳實踐

我在想這是否是一種正確的方法。或者有沒有其他最好的方法來處理這種情況。當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 [email protected] and [email protected] and EditSourceId = @nEditSourceId) 
    BEGIN 
     DELETE FROM ClaimCurrentEdits where [email protected] and [email protected] 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 

回答

0

如果XML將是在大的方面,OpenXML的是隻要你確保儘快完成後運行sp_xml_removedocument走的路線。如果您將在xml上看到更小的塊,我認爲XQuery更快,並且不會將sp_xml_preparedocument中的任何內存問題帶入表中。

我一直髮現,根據您的需求嘗試使用有效大小的xml這兩種方法是最好的方法。