Будет ли этот откат / остановить все записи от вставки? - PullRequest
0 голосов
/ 20 мая 2010

Я прошел этот урок

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, и что-то пойдет не так. Будет ли он откатывать все записи или просто остановится, и записи, которые произошли до того, как произошел сбой, будут вставлены?

1 Ответ

0 голосов
/ 20 мая 2010

Транзакция является атомарной. Либо все вставленные записи фиксируются, либо все откатываются. Оператор всегда выполняет обновления как часть транзакции. Таким образом, этот 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
...