【问题标题】:Would this rollback/stop all records from inserting?这会回滚/停止插入所有记录吗?
【发布时间】:2010-05-20 03:42:08
【问题描述】:

我一直在学习这个教程

http://www.codeproject.com/KB/linq/BulkOperations_LinqToSQL.aspx

他们制作了这样的 SP

CREATE PROCEDURE [dbo].[spTEST_InsertXMLTEST_TEST](@UpdatedProdData nText)
AS 
 DECLARE @hDoc int   

 exec sp_xml_preparedocument @hDoc OUTPUT,@UpdatedProdData 

 INSERT INTO TBL_TEST_TEST(NAME)
 SELECT XMLProdTable.NAME
    FROM OPENXML(@hDoc, 'ArrayOfTBL_TEST_TEST/TBL_TEST_TEST', 2)   
       WITH (
                ID Int,                 
                NAME varchar(100)
            ) XMLProdTable

EXEC sp_xml_removedocument @hDoc

现在我的要求要求我一个接一个地批量插入和批量更新。所以首先我想知道我可以将它们合并到一个SP中吗?我不确定它如何与这个 OPENXML 一起工作,但我认为它只是确保 XPath 是正确的。

接下来,当它运行这个组合的 SP 时会发生什么并且出现问题。它会回滚所有记录还是停止并插入在此事件之前发生的记录?

【问题讨论】:

    标签: sql-server sql-server-2005 linq-to-sql stored-procedures openxml


    【解决方案1】:

    事务是原子的。要么提交所有插入的记录,要么全部回滚。语句将始终将更新作为事务的一部分。所以这个 INSERT 要么全部提交,要么回滚,根本不会插入任何行。

    在 SQL 2005 中,您应该避免使用 NTEXT 类型和 OPENXML。它们效率低下,NTEXT 实际上已被弃用,还有更好的选择:

    .

    create procedure usp_insertxml (@data xml)
    as
    begin
      insert into table (id, name)
      select x.value('ID', 'INT'),
        x.value('NAME', 'varchar(100)')
      from @data.nodes('ArrayOfTBL_TEST_TEST/TBL_TEST_TEST') t(x);
    end
    

    【讨论】:

      猜你喜欢
      • 2013-02-20
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      • 2011-05-25
      相关资源
      最近更新 更多