2016-03-19 3 views
0

ich folgendes Skript bin mit einer Check-Bedingung zu erstellen, wenn es nicht existiert:Wie erhält man minimale und maximale Werte einer Check-Bedingung mit 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 

und mit der folgenden Abfrage einiger Informationen, die ich über die Einschränkung muß 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' 

, was ich kann nicht erreichen ist minimum und maximum retreive, die ich in der Constraint-Erstellung angegeben habe.

Können diese Werte mit TSQL abgerufen werden?

+1

Ich denke, Sie müssten die Constraint-Definition analysieren. SQL Server kennt keine Mindest- und Höchstwerte. –

+0

@Gordon Linoff Wie konnte der Ausdruck in tsql dann abgerufen und geparst werden? – Karamafrooz

Antwort

2

Ich denke, Sie müssen möglicherweise zu analysieren es aus dem Text; obwohl zumindest der Text normalisiert ist, was es ein bisschen einfacher macht:

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, ich habe versucht, es hat den folgenden Fehler: Nachricht 245, Ebene 16, Status 1, Zeile 10 Konvertierung fehlgeschlagen beim Konvertieren der Nvarchar-Wert '[APALogType]> = (1)' zu Datentyp int. – Karamafrooz

+0

@Karamafrooz - ah richtig; nachdem ich über die Normalisierung geredet habe - habe ich eigentlich nicht nachgeprüft was es normalisiert * zu *! Es umschließt die Werte in Klammern - Code aktualisiert. –

+0

funktioniert wie ein Charme! Vielen Dank ;) – Karamafrooz

Verwandte Themen