获取规范化检查约束文本

时间:2011-12-18 17:22:52

标签: sql-server-2008 constraints smo

我正在编写一个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执行此规范化而不是仅保留原始文本完整?这种规范化过程使得几乎不可能进行精确比较。

我尝试了以下内容:

  • 使用单个sql_variant列创建临时表,但这会导致抛出异常,因为临时表中不存在检查约束表达式中使用的列名。我可以解析表达式以提取列名并动态创建它们,但这会导致性能下降。
  • 将检查约束更新回文本属性,然后执行Refresh()以恢复文本。这不起作用,只需将原始文本放回原位。

如果有人有任何建议,我们将不胜感激。

更新

我决定采用第一个选项中描述的路线。

我不会在临时表中只有一个列,而是:

  • 使用Microsoft.Data.Schema.ScriptDom解析检查约束表达式,从表达式中提取出列名,然后将它们动态添加到临时表中。
  • 将检查约束添加到临时表中,然后再读取.Text属性以获取规范化文本。
  • 从临时表中删除检查约束。

到目前为止,这似乎有效,尽管在性能方面有一点折衷,但我可以忍受这一点。

我会在接下来的几周内看到这个问题,并以答案更新此问题,以便其他成员可以使用此信息。

0 个答案:

没有答案