Sqlserver是否包装'插入XX选择xxxx'作为隐含的交易

时间:2014-07-16 08:42:39

标签: sql sql-server database

我有一个商店程序,可以简化为:

INSERT into TABLE1 (column0, column1...) 
  SELECT field0, field1... from TABLE2

我注意到有时候TABLE1会错过插入的 SOME 数据,有什么可能导致这个问题?是不是自动换行为'隐式交易'

注意,SP是在.NET C#代码中调用的,当执行这个奇怪的问题时,我没有在执行期间发现任何异常。

[Edit0]: 这是我的生产代码中的原始sql语句:

CREATE PROCEDURE [dbo].[SaveSomething]
    --The only parameter passed from C# code which is a XML format string.
    @Source nvarchar(max)
AS
BEGIN
--Open that XML with a handle attached
EXEC sp_xml_preparedocument @docHandle OUTPUT, @Source

--turn that XML into a temp table
SELECT
     [PeriodID]
    ,[DESCRIPTION]
    ...
INTO #tmpPeriods
FROM OPENXML(@docHandle, N'/FirstLevelRoot/SecondLevelRoot/LeafNode') 
WITH (PeriodID nvarchar(10) '../@PromotionId',
    [DESCRIPTION] nvarchar(60) '@Reason', 
    ... )

--insert that temp table data to the real useful table. And this is the place we found randomly 
--some condition satisfied rows in tmpPeriods didn't get inserted to TargetTable.
INSERT INTO [dbo].[TargetTable](
     [ID]
    ,[DESCRIPTION]
    ...)
 SELECT
     SourceTable.[PeriodID]
    ,SourceTable.[DESCRIPTION]
    ...
FROM #tmpPeriods as SourceTable
LEFT JOIN [TargetTable]
ON SourceTable.[PeriodID] = TargetTable.ID
WHERE TargetTable.ID IS NULL

由于我的合作伙伴使用相同的输入XML字符串多次测试,并且所有表都已清空,但有时TargetTable会错过一些预期的行。

隔离级别是“Read Committed”的默认值。

1 个答案:

答案 0 :(得分:0)

检查桌面上的所有触发器。看起来你没有在Table1上插入触发器。如果您没有观察触发格式,可能会插入插入的一些数据。