- ルールは SQL Server の古い機能です。
- この機能は、Microsoft SQL Server の将来のバージョンでは削除される予定です。
.これが
MERGE
の理由だと思います ステートメントはルールのあるテーブルをサポートしていません。 - ルールを置き換えることができます チェック制約付き .
MERGE の例 (ルールと CHECK
を使用) 制約):
CREATE RULE MyRule AS @Status IN ('Y', 'N'); GO CREATE TABLE dbo.SalesOrder ( SalesOrderID INT PRIMARY KEY ,OrderDate DATETIME NOT NULL ,IsDeleted CHAR(1) NOT NULL DEFAULT 'N' ); GO EXEC sp_bindrule @rulename='MyRule', @objname='dbo.SalesOrder.IsDeleted'; GO INSERT dbo.SalesOrder (SalesOrderID, OrderDate) SELECT 1, '20110101' UNION ALL SELECT 2, '20110202' UNION ALL SELECT 3, '20110303'; GO SELECT * FROM dbo.SalesOrder; PRINT '*****First test*****'; GO MERGE dbo.SalesOrder Dst USING (VALUES (1,'Y'), (4,'Y')) AS Src(SalesOrderID, IsDeleted) ON Dst.SalesOrderID = Src.SalesOrderID WHEN MATCHED THEN UPDATE SET IsDeleted = Src.IsDeleted WHEN NOT MATCHED BY TARGET THEN INSERT (SalesOrderID, OrderDate, IsDeleted) VALUES (Src.SalesOrderID, GETDATE(), Src.IsDeleted); GO EXEC sp_unbindrule 'dbo.SalesOrder.IsDeleted'; --Disabling `MyRule` for IsDeleted column ALTER TABLE dbo.SalesOrder --We "replace" the old rule with a new `CHECK` constraint ADD CONSTRAINT CK_SalesOrder_IsDeleted CHECK( IsDeleted IN ('Y', 'N') ); GO PRINT '*****Second test*****'; MERGE dbo.SalesOrder Dst USING (VALUES (1,'Y'), (4,'Y')) AS Src(SalesOrderID, IsDeleted) ON Dst.SalesOrderID = Src.SalesOrderID WHEN MATCHED THEN UPDATE SET IsDeleted = Src.IsDeleted WHEN NOT MATCHED BY TARGET THEN INSERT (SalesOrderID, OrderDate, IsDeleted) VALUES (Src.SalesOrderID, GETDATE(), Src.IsDeleted); GO SELECT * FROM dbo.SalesOrder; DROP TABLE dbo.SalesOrder; DROP RULE MyRule;
プレ>結果:
Rule bound to table column. (3 row(s) affected) SalesOrderID OrderDate IsDeleted ------------ ----------------------- --------- 1 2011-01-01 00:00:00.000 N 2 2011-02-02 00:00:00.000 N 3 2011-03-03 00:00:00.000 N (3 row(s) affected) *****First test***** Msg 358, Level 16, State 1, Line 2 The target table 'Dst' of the MERGE statement cannot have any enabled rules. Found rule 'MyRule'. Rule unbound from table column. *****Second test***** (2 row(s) affected) SalesOrderID OrderDate IsDeleted ------------ ----------------------- --------- 1 2011-01-01 00:00:00.000 Y 2 2011-02-02 00:00:00.000 N 3 2011-03-03 00:00:00.000 N 4 2011-09-20 16:03:56.030 Y (4 row(s) affected)
プレ>