我正在开发数据迁移工具。当用户将字段添加到 UI 中的实体时,数据库架构本身会更新。这在尝试移动数据时会造成严重破坏。
我目前有一个包含所有源数据的临时表,但该临时表可能包含目标表没有的额外列。有没有办法用另一个表(在这种情况下是临时表)中的模式来更新表模式?表上有约束和索引,所以我不能只选择一个新表然后将其重命名为旧表。
我正在使用 .NET 4.0(所以没有 SMO),但 SQL 解决方案很好。
我正在开发数据迁移工具。当用户将字段添加到 UI 中的实体时,数据库架构本身会更新。这在尝试移动数据时会造成严重破坏。
我目前有一个包含所有源数据的临时表,但该临时表可能包含目标表没有的额外列。有没有办法用另一个表(在这种情况下是临时表)中的模式来更新表模式?表上有约束和索引,所以我不能只选择一个新表然后将其重命名为旧表。
我正在使用 .NET 4.0(所以没有 SMO),但 SQL 解决方案很好。
我建议在存储过程中为此使用动态 SQL。
您要做的是找出临时表的架构。假设您创建了一个名为 #nameoftemptable 的临时表,这应该有助于您入门:
SELECT t.name, c.name as colname, types.name, types.max_length
FROM tempdb.sys.tables t
JOIN tempdb.sys.columns c on t.object_id = c.object_id
JOIN sys.types on c.system_type_id = types.system_type_id
WHERE t.name like '#nameoftemptable%'
注意“tempdb”的使用——这是存储临时表的地方。这将返回临时表中的所有列及其数据类型。
接下来,您需要为类似的查询返回相同的数据,但不是查询 tempdb,而是查询您的数据库名称和表名称:
SELECT t.name, c.name as colname, types.name, types.max_length
FROM dbname.sys.tables t
join dbname.sys.columns c on t.object_id = c.object_id
join dbname.sys.types on c.system_type_id = types.system_type_id
where t.name = 'TableName'
现在您应该能够比较哪些列是新列并ALTER TABLE
相应地使用该命令。
希望这会有所帮助,祝你好运。