時々 (常にではないが) 失敗するタイプの 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」を使用します (解析時に列が存在しない場合、パーサーはエラーをスローします)。
この問題が時々発生する理由はありますか?