2017-01-21 19 views
1

私はテーブルに列レベルのチェック制約を作成しようとしています。私は値が列に挿入されていることを確認し、それらが文字であることを確認します。正規表現のための正規表現チェック制約

たとえば、values ('hello','there')が合格しますが、values ('h3llo','th3r3')は合格しません。

特定の文字数(下記の表を参照してください)で動作するようになっていますが、動的にしたいと考えています。

私は^[a-zA-Z]+$も試してみましたが、それはどちらかといえないようです。

単純な表のレイアウトは以下のとおりです。

CREATE TABLE owner 
    (
    owner_id  ID IDENTITY(1, 1) PRIMARY KEY, 
    owner_firstname FIRSTNAME, 
    owner_lastname LASTNAME, 
    CONSTRAINT firstname_cc CHECK (owner_firstname LIKE '[a-zA-Z][a-zA-Z][a-zA-Z]'), 
    CONSTRAINT lastname_cc CHECK (owner_lastname LIKE '[a-zA-Z][a-zA-Z][a-zA-Z]') 
); 

答えて

2

SQL Server LIKE構文では正規表現は使用できません。

check (owner_firstname not like '%[^A-Z]%')を使用できます。

この制約は、A-Zの範囲外の文字を含む値を拒否します。

大文字と小文字を区別して照合する場合を除き、a-zも指定する必要はありません。

+0

これを試して、次の文字を挿入しようとすると、 値( 'TEST'、 'LOL'); 次のエラーが引き続き発生します **メッセージ547、レベル16、状態0、行1 INSERTステートメントがCHECK制約 "firstname_cc"と競合しました。競合は、データベース "alcromer"、テーブル "dbo.owner"、列 'owner_firstname'で発生しました。 ステートメントが終了しました。** – RoflWaffle17

+0

@ RoflWaffle17 - そのステートメントはうまく動作します。http://rextester.com/NFYXQ38880 –

+0

それは私のために働いていないようです.....私はあなたのコードをそのままコピーして貼り付けました。上記のリンク。私はまた、次のバージョンを実行している、SQL Server 2012のマイクロソフト(SP3-GDR)(KB3194721) - 11.0.6248.0(X64) \t 2016年9月23日15時49分43秒 \t著作権(c)マイクロソフトコーポレーション \tエンタープライズ版(64ビット)Windows NT 6.2 (ビルド9200:)(ハイパーバイザ) – RoflWaffle17