Я использую SQL Server Management Studio 19 для переноса данных из исходной базы данных в целевую базу данных.
Я выбираю собственный клиент SQL Server 11.0 в качестве источника данных.
В качестве места назначения я также использую «Собственный клиент SQL Server 11.0» и выбираю целевую базу данных в качестве места назначения.
Данные были успешно экспортированы, но ограничения первичного и внешнего ключей отсутствуют. Что я пропустил?
Любая помощь или любые предложения приветствуются. Большое спасибо!
Привет, @Jesse, пожалуйста, поправь меня, если я неправильно понял твой ответ.
@Nick.McDermaid Спасибо, попробую.
Есть два способа экспортировать PK и FK.
Мы также можем написать несколько скриптов для экспорта PK и FK таблиц User вручную.
Я создал сценарий sql для экспорта PK и FK из системных таблиц и представлений.
2.1 Мы можем использовать следующий скрипт для экспорта PK.
select case when colNo = 1 then concat('alter table ',concat(concat(res.schemaName,'.'),res.tableName)) else '' end headerOne,
case when colNo = 1 then concat(concat('add constraint ' , res.PKName),' primary key( ') else '' end headerTwo,
case when colNo = 1 then colName else concat(',',colName) end headerThree,
case when colNo = s2.maxRow then ');' else '' end as headerFour
from (
select s.name as schemaName,i.name as PKName,ov.name as tableName,c.name as colName,k.colid as colNo,k.keyno as indexNO
from
sysindexes i
join sysindexkeys k on i.id = k.id and i.indid = k.indid
join sysobjects o on i.id = o.id
join sys.objects ov on o.id = ov.object_id
join sys.schemas s ON ov.schema_id = s.schema_id
join syscolumns c on i.id=c.id and k.colid = c.colid
where o.xtype = 'U' and exists(select 1 from sysobjects where xtype = 'PK' and name = i.name)
) res
left join
(select schemaName,PKName,tableName,max(rono) as maxRow
from
(
select s.name as schemaName,i.name as PKName,ov.name as tableName,c.name as colName, ROW_NUMBER() OVER (PARTITION BY s.name,i.name,ov.name ORDER BY o.name,k.colid) AS rono
from
sysindexes i
join sysindexkeys k on i.id = k.id and i.indid = k.indid
join sysobjects o on i.id = o.id
join sys.objects ov on o.id = ov.object_id
join sys.schemas s ON ov.schema_id = s.schema_id
join syscolumns c on i.id=c.id and k.colid = c.colid
where o.xtype = 'U' and exists(select 1 from sysobjects where xtype = 'PK' and name = i.name)
) s1
group by schemaName,PKName,tableName
) s2 on res.schemaName = s2.schemaName and res.PKName=s2.PKName and res.tableName=s2.tableName
2.2 Затем мы можем скопировать скрипт из SSMS.
2.3 Затем мы вставляем скрипт в окно запроса промежуточной базы данных, чтобы выполнить скрипт.
2.4 После создания ПК таким же образом мы можем экспортировать ПК и создавать их.
select
concat(concat('alter table ',c.CONSTRAINT_SCHEMA),concat('.',fk.TABLE_NAME)),
concat(' add constraint ', c.CONSTRAINT_NAME), --cu.COLUMN_NAME
concat(' foreign key( ',cu.COLUMN_NAME),
concat(concat(') references ',c.CONSTRAINT_SCHEMA),concat('.',pk.TABLE_NAME)),
concat(concat('(',pt.COLUMN_NAME),');')
from
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS c
inner join INFORMATION_SCHEMA.TABLE_CONSTRAINTS fk
on c.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
inner join INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk
on c.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
inner join INFORMATION_SCHEMA.KEY_COLUMN_USAGE cu
on c.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
inner join (
select
i1.TABLE_NAME,
i2.COLUMN_NAME
from
INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
inner join INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2
on i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
where
i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
) PT
on pt.TABLE_NAME = pk.TABLE_NAME
Разве я не видел, что этот точный вопрос уже задан? Я предлагаю вам использовать файл .bacpac для передачи данных