SQL Serverは、制約をチェックするときに正規表現をサポートしています;トリガーは常に必要ではありません

誰かがこの質問をしました:



コード列を持つグループテーブルを作成する必要があります。 アルファベット文字(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は失敗します。

ご覧のとおり、制約で正規表現を使用することは可能で、この場合トリガーは不要です。



All Articles