また、式の「正規化」は、括弧を追加するだけでなく、いくつかの式を非常に異なる方法で変更することもあるということも付け加えておきます。
たとえば、MS SQL 2008 Express では、次の式でデフォルトを作成しました。
year(getdate()) + 1
しかし、SQL Serverはそれを次のように変更します
(datepart(year,getdate())+(1))
したがって、どのような種類のルールや正規表現でも問題が 100% 解決するとは思わないので、いくつかの方法を組み合わせることをお勧めします。
1)まず第一に、あなたの場合、ほとんどのデータベースに通常存在する典型的な制約の数は限られていると思います。原則として、getdate()、および定数数値式 (0)、(1) があります。期待される式と実際の式を一致させるのに役立つ典型的な制約の表を用意できます。
2) 次に、すべてのフィールド名を [] 括弧内に含め、すべての定数と数学演算を () 内に含める非常に単純なルールを試すことができるため、年 + 1は([年] + (1))に変換されます。これは正規表現でできると思います。
3) 1 番目または 2 番目の方法を使用して期待される結果と実際の結果を比較できなかったすべてのケースについて、提案したことを行います - 一時テーブルを作成して結果を比較します。
EDIT 04.Aug:
データベース レベルのデフォルトを作成すると、正規化されないことがわかりました。変ですよね?しかし、おそらく、この事実を利用して、列の既定の制約を作成する代わりに、列にバインドするデータベース レベルの既定値を作成することができます (ただし、これは設計上の非常に大きな変更であり、既存のデータベースの大幅な更新が必要になると思います)。
列の既定の制約、および正規化された形式を取得するために既定を動的に作成/削除する方法については、Microsoft.SqlServer.Management.Smo ライブラリを使用した単純な C# コードを次に示します。IntTest int、VarcharTest varchar(1)、DateTimeTest datetime などの列を含む 1 つの test_table を作成することをお勧めします。つまり、各型に対して 1 つの列のみです。この場合、デフォルトを作成/ドロップしますが、ドロップ テーブルと列を作成する必要はなく、これによりパフォーマンスが向上します。
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();