0

時々 (常にではないが) 失敗するタイプの DDL コンストラクトがあります。構成は次のとおりです。

IF NOT EXISTS (SELECT 'b' 
               FROM   sys.COLUMNS A 
                      INNER JOIN sys.TABLES B 
                              ON A.OBJECT_ID = B.OBJECT_ID 
               WHERE  a.NAME = 'BadgeID' 
                      AND b.NAME = 'AllianceIncentBadges') 
  BEGIN 
      ALTER TABLE dbo.ALLIANCEINCENTBADGES 
        ADD BADGEID INT NOT NULL DEFAULT 0; 

      EXEC Sp_executesql 
N'MERGE INTO AllianceIncentBadges USING IncentiveBadges ON AllianceIncentBadges.BadgeName = IncentiveBadges.BadgeName WHEN MATCHED THEN UPDATE SET BadgeID = IncentiveBadges.BadgeID;'
    ; 
END; 

go 

最初に「ALTER」テーブルを実行し、次に「EXEC」を実行すると、すべて問題ありません。ただし、上記の構成を使用して実行すると、BadgeID フィールドは追加されず、EXEC は不足している列に対してエラーをスローします。パーサーがエラーをスローしないように「EXEC」を使用します (解析時に列が存在しない場合、パーサーはエラーをスローします)。

この問題が時々発生する理由はありますか?

4

1 に答える 1

1
BEGIN TRY
    ALTER TABLE dbo.AllianceIncentBadges ADD BadgeID int NOT NULL Default 0;
    MERGE INTO AllianceIncentBadges USING IncentiveBadges ON AllianceIncentBadges.BadgeName = IncentiveBadges.BadgeName WHEN MATCHED THEN UPDATE SET BadgeID = IncentiveBadges.BadgeID;
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> '2705' THROW;
END CATCH
于 2013-07-31T16:45:49.207 に答える