0

私の c# プロジェクトの 1 つで、データベース テーブルに複数の行を格納する必要があります。そのために、ストアド プロシージャで 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 に答える