Этого ответа и ответа ГБН достаточно. Однако, FWIW, я заметил шаблон, по крайней мере, в моих базах данных, когда SQL Server сохраняет значения по умолчанию в одинарных или двойных скобках.
- Двойные скобки для чисел (все целые числа в моем случае).
- Одиночные скобки для не чисел (то есть строк и функций).
- Все определения хранятся как минимум в одном наборе скобок.
- Нет определений, сохраненных в более чем двух наборах скобок.
Хотя это может не повлиять на функциональность и т. Д., Как программист, приятно знать, что существует шаблон.
Ниже приведен запрос для проверки значений по умолчанию в базе данных на соответствие этим правилам (это может быть не идеально, но это начало).
-- Find number of distinct defaults. This should match the number of records in following query
-- to ensure all are accounted for.
select count(*) as NumberOfDistinctConstraints
from (select distinct [definition] from sys.default_constraints) t
;
-- Find defaults that follow and don't follow the rules.
;with c1 as (
select [definition] as DefaultValue, 3 as NumberOfParentheses
from sys.default_constraints dc
where [definition] like '(((%'
union
select [definition], 2
from sys.default_constraints dc
where [definition] like '(([^(]%'
union
select [definition], 1
from sys.default_constraints dc
where [definition] like '([^(]%' --and ([definition] like '(N''%' or [definition] like '(''%')
union
select [definition], 0
from sys.default_constraints dc
where [definition] like '[^(]%'
)
, c2 as (
select
DefaultValue
, NumberOfParentheses
, case
when
NumberOfParentheses >= 3 -- None exists.
or NumberOfParentheses = 0 -- None exists.
or (
-- Any double parentheses not followed by a digit or negative sign.
NumberOfParentheses = 2
and substring(DefaultValue, 3, 1) not like ('[0-9]')
and substring(DefaultValue, 3, 1) not like ('-')
)
or (
-- Any single parenthesis followed by a digit or negative sign.
NumberOfParentheses = 1
and (
substring(DefaultValue, 2, 1) like ('[0-9]')
and substring(DefaultValue, 2, 1) like ('-')
)
)
then
0
else 1
end as FollowsTheRules
from c1
)
select *
from c2
--where FollowsTheRules = 0
order by FollowsTheRules asc, NumberOfParentheses desc, DefaultValue asc
;
Я проверил несколько баз данных, и эти правила соблюдались. Тем не менее, мне было бы интересно узнать, видят ли другие такие же результаты.