我正在研究数据迁移工具。当用户向UI中的实体添加字段时,将更新数据库模式本身。这在尝试移动数据时会造成严重破坏。
我目前有一个包含所有源数据的临时表,但该临时表可能有目标表所没有的额外列。有没有办法用另一个表(在这种情况下,临时表)中使用模式更新表模式?表上有约束和索引,所以我不能只选择一个新表,然后将其重命名为旧表。
我在.NET 4.0中工作(所以没有SMO),但SQL解决方案很好。
答案 0 :(得分:0)
我建议在存储过程中使用动态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
命令。
希望这会有所帮助,祝你好运。