Я также добавлю, что «нормализация» выражения иногда не только добавляет скобки, но и меняет некоторые выражения совсем по-другому!
Например, в MS SQL 2008 Express я создал значение по умолчанию со следующим выражением:
year(getdate()) + 1
но SQL Server меняет его на
(datepart(year,getdate())+(1))
Итак, я не верю, что какие-либо правила или регулярные выражения решат вашу проблему в 100% случаев, поэтому я рекомендую вам объединить несколько методов
1) Прежде всего я думаю, что в вашем случае существует ограниченное количество типичных ограничений, которые обычно существуют в большинстве баз данных. Как правило, есть getdate () и константные числовые выражения (0), (1). Вы можете иметь таблицу этих типичных ограничений, которые помогут вам сопоставить ожидаемые и реальные выражения.
2) Тогда вы можете попробовать очень простое правило, чтобы включить имена всех полей в скобки [] и все константы и математические операции в (), так что вы получите year + 1 , преобразованный в ( [год] + (1)) . Я полагаю, это можно сделать с помощью регулярных выражений.
3) для всех случаев, когда вы не смогли сравнить ожидаемые и фактические результаты, используя 1-й или 2-й метод, вы будете делать то, что предлагали, - создать временную таблицу и сравнить результаты.
РЕДАКТИРОВАТЬ 04.Aug:
Я обнаружил, что при создании значений по умолчанию на уровне базы данных они не будут нормализованы. Странно, а? Но, вероятно, вы можете использовать этот факт и создавать значения по умолчанию на уровне базы данных, которые вы привязываете к столбцам вместо создания ограничений по умолчанию для столбцов (хотя, я полагаю, это будет очень большое изменение в дизайне и потребует огромного обновления существующих баз данных)
Что касается ограничений по умолчанию для столбцов и подхода к динамическому созданию / удалению по умолчанию для получения их нормализованной формы, то здесь приведен простой код C # с использованием библиотеки Microsoft.SqlServer.Management.Smo. Я предлагаю создать одну test_table со столбцами IntTest int, VarcharTest varchar (1), DateTimeTest datetime и т. Д., Т. Е. Только один столбец для каждого типа. В этом случае вы создадите / удалите значения по умолчанию, но вам не нужно будет создавать удаленные таблицы и столбцы, что повысит производительность.
Код C # будет следовать (включая использование Microsoft.SqlServer.Management.Smo;)
Server server = new Server("localhost\\SQLEXPRESS");
Database db = server.Databases["test"];
Table t = db.Tables["test_defaults"];
//here should be some logic to select column name depending on default data type
//for example for DateTime defaults we will use "DateTimeTest" column
Column c = t.Columns["DateTimeTest"];
//clean up previous results if they exist
DefaultConstraint constr = c.DefaultConstraint;
if (constr != null) constr.Drop();
//create new constraint
constr = c.AddDefaultConstraint();
constr.Text = "getdate()";
constr.Create();
//after refresh we will have a new text
constr.Refresh();
string result = constr.Text;
//drop it if we don't need it
constr.Drop();