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