2016-03-19 19 views
0

私はそれが存在しない場合はチェック制約を作成するには、次のスクリプトを使用しています:TSQLを使用してチェック制約の最小値と最大値を取得する方法は?

if not exists (select * from dbo.sysobjects where id= object_id(N'[APA].[CK_APALog_APALogType_Range]') and OBJECTPROPERTY(id,N'IsConstraint')=1) 
    ALTER TABLE [APA].[APALog] ADD CONSTRAINT CK_APALog_APALogType_Range CHECK (APALogType >=1 AND APALogType <=3) 
go 

と制約について、私は必要ないくつかの情報をretreiveing次のクエリを持つ:

select constraintsColumns.COLUMN_NAME ,tableConstraints.CONSTRAINT_NAME ,tableConstraints.CONSTRAINT_TYPE ,tableConstraints.TABLE_NAME 
from information_schema.TABLE_CONSTRAINTS tableConstraints 
join information_schema.CONSTRAINT_COLUMN_USAGE constraintsColumns 
    on tableConstraints.TABLE_NAME=constraintsColumns.TABLE_NAME 
    and tableConstraints.CONSTRAINT_NAME =constraintsColumns.CONSTRAINT_NAME 
where tableConstraints.CONSTRAINT_TYPE in ('CHECK') and constraintsColumns.COLUMN_NAME='APALogType' 

を私はできません制約の作成で指定した値minimummaximumを取得することができます。

これはTSQLを使用してこれらの値を取得できますか?

+1

私は制約の定義を解析する必要があると思います。 SQL Serverは、最小値と最大値があることを「認識」していません。 –

+0

@ Gordon Linoffどのように式を取得し、tsqlで解析することができましたか? – Karamafrooz

答えて

2

私はあなたがテキストからそれを解析する必要があるかもしれないと思います。少なくともテキストは正規化されているため、少し簡単になります。

DECLARE @text nvarchar(4000) 
SELECT @text = CHECK_CLAUSE 
FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS 
WHERE CONSTRAINT_NAME = 'CK_APALog_APALogType_Range' AND CONSTRAINT_SCHEMA = 'APA' 

DECLARE @nClose int 

DECLARE @nGreaterThan int = PATINDEX('%>=([0-9]%', @text) + 3 --Add 3 for the >=(
SET @nClose = CHARINDEX(')', @text, @nGreaterThan) 
DECLARE @min int = CONVERT(int, SUBSTRING(@text, @nGreaterThan, @nClose - @nGreaterThan)) 
PRINT 'Min = ' + CONVERT(varchar, @min) 

DECLARE @nLessThan int = PATINDEX('%<=([0-9]%', @text) + 3 --Add 2 for the <=(
SET @nClose = CHARINDEX(')', @text, @nLessThan) 
DECLARE @max int = CONVERT(int, SUBSTRING(@text, @nLessThan, @nClose - @nLessThan)) 
PRINT 'Max = ' + CONVERT(varchar, @max) 
+0

thx、次のエラーがあります:メッセージ245、レベル16、状態1、行10 nvarchar値 '[APALogType]> =(1)'をデータ型intに変換すると変換に失敗しました。 – Karamafrooz

+0

@Karamafrooz - ああそうです。私が正規化について話した後、実際に正規化するものをチェックしなかった*!それはカッコ内の値をラップします - コードは更新されました。 –

+0

は魅力的に機能します!本当にありがとう ;) – Karamafrooz

関連する問題