1

SQL#CLR関数RegEx_IsMatchを実際に呼び出すユーザー定義関数を列に追加しようとしていますが、次のエラーが発生します。

このコンテキストでは、ユーザー定義の関数名の前にデータベース名を付けることはできません。

しかし、関数が別のデータベースにある場合、これを行う方法がわかりません。

4

2 に答える 2

1

でこれを行う必要はありませんCHECK CONSTRAINT。トリガーは、AFTER INSERT, UPDATEと同じ機能を提供できる必要がありますCHECK CONSTRAINT。必要な条件が満たされている (または満たされていない) 場合は、 INSERTor操作をキャンセルするだけです。これは、DML ステートメント自体であるトランザクション内にトリガーが存在するために機能する をUPDATE発行するだけで簡単に実行できます。ROLLBACKしたがって、次の行に沿って何かを行うだけです。

CREATE TRIGGER dbo.trCheckSomeField
ON dbo.SomeTable
AFTER INSERT, UPDATE
AS
SET NOCOUNT ON;

IF (EXISTS(
        SELECT *
        FROM   Inserted ins
        WHERE  Utility.SQL#.RegEx_IsMatch(ins.SomeField, ...) = 0
          )
    )
BEGIN;
  ROLLBACK TRAN;
  RAISERROR('Your data suck!', 16, 1);
  RETURN;
END;
于 2015-08-15T20:32:28.450 に答える
0

試したことはありませんが、同じ DB にヘルパー関数を作成して、他の DB を呼び出すことはできますか?

ただし、チェック制約は決定論的な AFAIR であると想定されており、他のデータベースへの呼び出しは決定論的ではないため、これは失敗する可能性があります。一般に、正規表現チェックのためだけであっても、別の DB を呼び出すことはお勧めできません。この DB にも CLR アセンブリを追加してみませんか?

于 2012-01-01T22:57:37.987 に答える