[英]What is best practice to deal with XML input parameter in SQL Server
在我的一个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
如果xml过于庞大,那么只要确保确保一旦完成就运行sp_xml_removedocument,OpenXML就是正确的选择。 如果您要在xml上看到较小的块,我认为XQuery更快,并且不会将sp_xml_preparedocument中的任何内存问题带到表中。
我一直发现,尝试使用两种有效大小的xml方法来满足您的需求是最好的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.