Недостаточно сравнить только один тип данных.
Если это nvarchar
/ nchar
/ varchar
/ char
/ varbinary
/ binary
, вам также необходимо сравнить максимально допустимый длина,
, если это date
/ time
/ datetime2
/ datetimeoffset
, вам нужно сравнить масштаб. и если это decimal
/ numeric
, вам нужно сравнить масштаб и точность.
Чтобы проверить ключевые ограничения, вам нужно запросить еще две таблицы - sys.indexes
и sys.index_columns
.
К счастью для вас, вам не нужно писать все самому, поскольку я уже проделал большую часть этой работы ранее для моего последнего сообщения в блоге.
Соответствующая часть кода находится в начале скрипта, где я заполняю таблицу, которую позже использую для построения динамических c SQL from - вот оператор select (я добавил псевдонимы, чтобы упростить его. чтобы понять):
SELECT col.Name As ColumnName,
typ.Name As TypeName,
CAST(col.max_length as nvarchar(11)) As MaxLength,
IIF(typ.name IN ('nvarchar', 'nchar', 'varchar', 'char', 'varbinary', 'binary'), 1, 0) As IncludeMaxLength,
IIF(idx.is_primary_key = 1, 1, 0) As IsPkColumn,
col.is_identity As IsIdentity,
col.is_computed As IsComputed,
SIGN(/*col.generated_always_type*/0) As IsAutoGenerated,
IIF(typ.name IN('numeric', 'decimal'), 1, 0) As IncludePrecisionAndScale,
col.[precision],
IIF(typ.name IN('datetimeoffset', 'datetime2', 'time'), 1, 0) As IncludeScale,
col.scale
FROM sys.columns as col
JOIN sys.types As typ
ON col.system_type_id = typ.system_type_id
AND col.user_type_id = typ.user_type_id
JOIN sys.tables as tab
ON col.object_id = tab.object_id
LEFT JOIN sys.index_columns idxCol
ON col.object_id = idxCol.object_id
AND idxCol.column_id = col.column_id
LEFT JOIN sys.indexes idx
ON idx.object_id = tab.object_id
AND idxCol.index_id = idx.index_id
WHERE tab.name = @TableName
Вы можете выполнить этот запрос для обеих таблиц и сравнить любые соответствующие данные для любого столбца в таблицах.