Получение нормализованного текста проверочного ограничения - PullRequest
2 голосов
/ 18 декабря 2011

Я пишу инструмент сравнения схем 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 изменяет выражение, поэтому оно больше не соответствует исходному выражению.

У меня возникли сложности с получением нормализованного текста из ограничения check / default, и я не совсем понимаю, почему SQL Server выполняет эту нормализацию, а не просто оставляет исходный текст нетронутым?Этот процесс нормализации делает практически невозможным точное сравнение.

Я пробовал следующее:

  • Создание временной таблицы с одним столбцом sql_variant, но это вызывает исключение длябыть брошенным, потому что имя столбца, используемое в выражении ограничения проверки, не существует во временной таблице.Я мог бы проанализировать выражение, чтобы извлечь имена столбцов и создать их динамически, но это может привести к снижению производительности.
  • Обновление проверочного ограничения обратно в свойство text и последующее выполнение Refresh() для получения текстаобратно.Это не работает и просто помещает оригинальный текст обратно.

Если у кого-то есть какие-либо предложения, они будут очень благодарны.

Обновление

Я решил выбрать маршрут, описанный в первом варианте.

Вместо того, чтобы иметь единственный столбец во временной таблице, я буду:

  • проанализировать выражение контрольного ограничения, используя Microsoft.Data.Schema.ScriptDom для извлечения имен столбцовиз выражения, а затем динамически добавьте их во временную таблицу.
  • добавьте проверочное ограничение во временную таблицу, а затем прочитайте свойство .Text, чтобы получить нормализованный текст.
  • dropпроверочное ограничение из временной таблицы.

Пока что это, кажется, работает эффективно, хотя и с небольшим компромиссом с точки зрения производительности, но я могу с этим смириться.

Я посмотрю, как это получится в ближайшие несколько недель, и дополню этот вопрос ответом, чтобы другие участники могли использовать эту информацию.

...