SQL事务基础

时间:2014-05-01 17:12:33

标签: sql sql-server

过去几天我一直在SQL相关论坛上跳过(我是新的)并且我已经取得了一些进展!但是,我似乎无法解决这个问题。这是我的疑问:

USE EpiworksTest;

BEGIN TRANSACTION [tran3]
BEGIN TRY
    INSERT [Catalog].[TaskDefinition] ([ID], [WIPDesc], [SpecTable], [ResultsTable], [SpecFilePath], [SpecFileName], [SetupFilePath], [SetupFileName], [EWProduct], [Process], [Active], [CalcDur], [UnTimedEst], [ChamberUse], [DateCreated]) 
    VALUES (1, N'wp', N'spec', N'0', NULL, NULL, NULL, NULL, N'ew', NULL, NULL, NULL, NULL, NULL, NULL);
    SET IDENTITY_INSERT [Catalog].[TaskDefinition] OFF
    INSERT [Catalog].[TaskStatus] ([ID], [Name], [Description]) 
    VALUES (1, N'Static', N'wat');
    COMMIT TRANSACTION [tran3]
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION [tran3]
END CATCH

我已经检查并重新检查了我的表格列 - 它们与此处的两个插页都匹配。 我的两张桌子目前都是空的。此查询表示它已成功完成,但即使我有两个插入,也没有更新行!有任何想法吗?我试过重新创建我的架构。 请问SQL"编译器?"告诉我它是否有错误我抓住或告诉我,如果它回滚任何变化?我有一种感觉,尝试/捕获或交易时有一些时髦的事情,因为那是我今天所知道的。感谢您的回复。

2 个答案:

答案 0 :(得分:1)

默认情况下,IDENTITY_INSERT选项为OFF,因此如果您未将其设置为ON,则无需将其设置为off。我认为这是你想要做的事情。

USE EpiworksTest;


BEGIN TRY
   BEGIN TRANSACTION [tran3]; 

    SET IDENTITY_INSERT [Catalog].[TaskDefinition] ON;
    INSERT [Catalog].[TaskDefinition] ([ID], [WIPDesc], [SpecTable], [ResultsTable], [SpecFilePath], [SpecFileName], [SetupFilePath], [SetupFileName], [EWProduct], [Process], [Active], [CalcDur], [UnTimedEst], [ChamberUse], [DateCreated]) 
    VALUES (1, N'wp', N'spec', N'0', NULL, NULL, NULL, NULL, N'ew', NULL, NULL, NULL, NULL, NULL, NULL);
    SET IDENTITY_INSERT [Catalog].[TaskDefinition] OFF;

    INSERT [Catalog].[TaskStatus] ([ID], [Name], [Description]) 
    VALUES (1, N'Static', N'wat');

    COMMIT TRANSACTION [tran3];
END TRY
BEGIN CATCH
  IF (@@TRANCOUNT > 0)
   BEGIN
    ROLLBACK TRANSACTION [tran3];
   END

    SELECT  ERROR_MESSAGE()  AS [Error_Message]
           ,ERROR_LINE()     AS [Error_Line]
           ,ERROR_NUMBER()   AS [Error_Number]
           ,ERROR_SEVERITY() AS [Error_Severity]

END CATCH

答案 1 :(得分:1)

您正在抑制所有错误,因此您永远不会看到它们。这是一个非常严重的反模式,现在你知道为什么了。取消抑制错误。我建议你添加

THROW

到catch块,它重新抛出当前错误。错误通常应该冒出一个可以有意义地处理和记录它们的地方。