誰かがこの質問をしました:
コード列を持つグループテーブルを作成する必要があります。 アルファベット文字(D、M、O、P、またはT)の後に2つの数字のみを許可する列制限を追加することは可能ですか?
彼らは彼に答えた:
通常の方法でこれを行うことはできません-MS SQL Serverは制約チェックをサポートしますが、INTの最小/最大値、行の長さなどの形式でのみサポートします。 必要なのは、SQL Serverがサポートしていない正規表現チェックです。 理論的には、.NET挿入を行い、それをSQL Serverに展開し、簡単なタスクではなく、そのようなチェックを使用するように強制できます。
それを理解してみましょう
SQLサーバーは正規表現を完全にはサポートしていないという事実にもかかわらず、上記のタスクはT-SQLで問題なく解決できます。 これは、この正規表現の外観です。
[DMOPT][0-9][0-9]
アルファベット文字(D、M、O、P、またはT)の後に2つの数字が続く場合のみ使用できます。 さて、十分に話をして、コードを見てみましょう。
テーブルを作成する
CREATE TABLE blatest(code char(3))
制限チェックを追加
ALTER TABLE blatest ADD CONSTRAINT ck_bla CHECK (code like '[DMOPT][0-9][0-9]' ) GO
データを挿入するためのいくつかの手順
INSERT blatest VALUES('a12') -- INSERT blatest VALUES('M12') -- INSERT blatest VALUES('D12') -- INSERT blatest VALUES('DA1') --
ご覧のとおり、エラーメッセージが2回表示されました
547, 16, 0, 1
INSERT CHECK "ck_bla". "Test", "dbo.blatest", 'code'.
.
d12ではなくD12を挿入する場合、つまり 大文字と小文字の区別が必要な場合は、このような制限を作成する必要があります
(code like '[DMOPT][0-9][0-9]' COLLATE SQL_Latin1_General_CP1_CS_AS )
変更する必要があるのは、照合パラメーターSQL_Latin1_General_CP1_CS_ASを追加することだけでした。
このパラメーターが提供するものを確認するには、次のクエリを実行します
SELECT * FROM ::fn_helpcollations() WHERE name = 'SQL_Latin1_General_CP1_CS_AS'
説明でリクエストが返したものは次のとおりです
Latin1-General, case-sensitive, accent-sensitive, kanatype-
insensitive, width-insensitive for Unicode Data, SQL Server Sort Order 51 on Code Page 1252 for non-Unicode Data
新しい制約を作成しましょうが、最初に古い制約を削除する必要があります
ALTER TABLE blatest DROP CONSTRAINt ck_bla GO
次に、新しいものを作成して確認します
ALTER TABLE blatest ADD CONSTRAINT ck_bla CHECK (code LIKE '[DMOPT][0-9][0-9]' COLLATE SQL_Latin1_General_CP1_CS_AS ) GO INSERT blatest VALUES('D12') -- INSERT blatest VALUES('d12') --
D12の値の挿入は成功しますが、d12は失敗します。
ご覧のとおり、制約で正規表現を使用することは可能で、この場合トリガーは不要です。