将大量数据从C ++应用程序传递到SQLServer存储过程的最快方法是什么?

时间:2017-12-06 20:10:36

标签: c++ sql-server xml performance stored-procedures

我试图以最有效的方式从c ++应用程序中的xml对象传递一千行到sqlserver存储过程。在将xml元素插入数据库之前,需要对xml元素进行一些字符串处理/转换。目前我们在C ++应用程序中获取每个单独的xml节点,然后调用sqlserver来插入它(并且这样做了一千次)。为了改善这一点,我想同时将所有1000条记录发送到sqlserver。最快的方法是什么?

另外,我已经看到我可以直接将xml发送到存储过程,但这会让我在将数据插入数据库之前对数据进行大量处理。在C ++应用程序中处理字符串然后通过xml发送它或者在未处理的xml中将其发送到SQLServer然后处理/转换字符串或者是否有另一种方法来完全传递数据是否更有效?

1 个答案:

答案 0 :(得分:0)

设置表值参数,每个参数集一行。然后使用该参数的行来调用存储过程。即使您要将行作为批处理提交到存储过程,每行也将是与服务器的单独通信,但如果您将其作为TVP执行,则驱动程序可以将其捆绑到单个往返行程中(即,所有行)数据将被发送然后服务器将开始处理,而不是发送一个参数集并返回该参数集的结果。

我不了解XML处理,这很可能取决于所需操作的性质,这部分听起来像是一个分析工作。

基本上类似于:

CREATE TYPE ARGS_TABLE TABLE (ID BIGINT, DATA XML);

CREATE PROCEDURE WRAPPER_PROC
@Args ARGS_TABLE READONLY
AS
BEGIN
DECLARE @ID BIGINT, @Data XML
DECLARE ArgCurs CURSOR FOR SELECT ID, DATA FROM @Args;
OPEN ArgsCurs ;
FETCH NEXT FROM ArgsCurs INTO @ID, @Data
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC dbo.REAL_PROC @ID, @Data
FETCH NEXT FROM ArgsCurs INTO @ID, @Data
END
CLOSE ArgsCurs 
    DEALLOCATE ArgsCurs 
END