Получение столбцов проверочного ограничения - PullRequest
1 голос
/ 22 октября 2019

Я использую следующий скрипт для получения проверочных ограничений и связанных с ним столбцов

select 
    col.[name] as column_name,
    con.[definition],    
    con.[name] as constraint_name
from sys.check_constraints con
    left outer join sys.objects t
        on con.parent_object_id = t.object_id
    left outer join sys.all_columns col
        on con.parent_column_id = col.column_id
        and con.parent_object_id = col.object_id

Но я получаю "NULL", когда выражение проверки касается 2 или более разных столбцов, например, в таблице, содержащей более2 столбца и проверочные ограничения выглядят так: ([col1] <> [col2]) или ([col1] < 0 and [col2] = 0).

. Я бы хотел заменить "Null", возвращенный в приведенном выше сценарии, строкой, например, "col1, col2"

1 Ответ

0 голосов
/ 22 октября 2019

Мы можем улучшить запрос, возвращая уровень ограничения вместо ограничения. Конечно, это вернет имя столбца только для ограничений уровня столбца. Для ограничений на уровне таблицы будет возвращено NULL.

column_name - имя столбца для проверочных ограничений на уровне столбца, нулевое для проверочных ограничений на уровне таблицы

SELECT 
  cc.name AS 'Constraint',
  cc.is_disabled AS 'Disabled?',
  CASE WHEN cc.parent_column_id = 0 THEN 'Table-level' ELSE 'Column-level' END AS 'Table/Column',
  o.name AS 'Table',
  ISNULL(ac.name, '(n/a)') AS 'Column',
  cc.Definition AS 'Constraint Definition'
FROM sys.check_constraints cc
LEFT OUTER JOIN sys.objects o ON cc.parent_object_id = o.object_id
LEFT OUTER JOIN sys.all_columns ac ON cc.parent_column_id = ac.column_id AND cc.parent_object_id = ac.object_id;

+-----------------+-------------+----------------+----------------+----------+----------------------------------------+
| Constraint      | Disabled?   | Table/Column   | Table          | Column   | Constraint Definition                  |
|-----------------+-------------+----------------+----------------+----------+----------------------------------------|
| chkPrice        | 0           | Column-level   | ConstraintTest | Price    | ([Price]>(0))                          |
| chkValidEndDate | 0           | Table-level    | ConstraintTest | (n/a)    | ([EndDate]>=[StartDate])               |
| chkTeamSize     | 0           | Column-level   | ConstraintTest | TeamSize | ([TeamSize]>=(5) AND [TeamSize]<=(20)) |
| chkJobTitle     | 0           | Column-level   | Occupation     | JobTitle | ([JobTitle]<>'Digital Nomad')          |
+-----------------+-------------+----------------+----------------+----------+----------------------------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...