我正在编写一个SQL Server架构比较工具,我需要提取默认&的文本表达式。检查来自任何数据库版本(2000,2005,2008和即将推出的2012版本)的表中的约束。
我使用SQL Server 2000 Northwind数据库作为源数据库,使用SQL Server 2008作为目标数据库。当我在[CK_Birthdate]
表上遇到Employees
检查约束时,它包含文本([BirthDate] < getdate())
。当通过T-SQL编写脚本然后在SQL Server 2008 R2中运行时,它变为(([BirthDate]<getdate()))
并且空格被删除。
我尝试剥离空间,这很好用,但是在阅读this之后,我惊讶地看到SQL Server更改了表达式,因此它不再与原始表达式匹配。
我在检查/默认约束中获取规范化文本时遇到了一些困难,我并不真正理解为什么SQL Server执行此规范化而不是仅保留原始文本完整?这种规范化过程使得几乎不可能进行精确比较。
我尝试了以下内容:
Refresh()
以恢复文本。这不起作用,只需将原始文本放回原位。如果有人有任何建议,我们将不胜感激。
更新
我决定采用第一个选项中描述的路线。
我不会在临时表中只有一个列,而是:
Microsoft.Data.Schema.ScriptDom
解析检查约束表达式,从表达式中提取出列名,然后将它们动态添加到临时表中。.Text
属性以获取规范化文本。到目前为止,这似乎有效,尽管在性能方面有一点折衷,但我可以忍受这一点。
我会在接下来的几周内看到这个问题,并以答案更新此问题,以便其他成员可以使用此信息。