Przygotowane w ten sposób skrypty wykonujesz przed TRUNCATE i po nim.
Jak poczekasz kilkanaście minut to naskrobie skrypt tylko muszę się przelogować na win.
/edit: obyło się bez kursora, byłby potrzebny tylko wtedy gdybyśmy chcieli każdy constraint na bieżąco dropować. Wykonaj oba zapytania i zapisz oba powstałe skrypty! Następnie wykonaj dropujący przed TRUNCATE i odtwarzający po nim. Aha i przetestuj je na jednej tabeli wcześniej, bo ja ich nie testowałem.
Kopiuj
SELECT 'ALTER TABLE '+ftab.name + ' ADD CONSTRAINT '+QUOTENAME(fk.name)+' FOREIGN KEY ('+REPLACE(
ISNULL(QUOTENAME(COL_NAME(r.fkeyid,r.fkey1)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.fkeyid,r.fkey2)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.fkeyid,r.fkey3)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.fkeyid,r.fkey4)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.fkeyid,r.fkey5)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.fkeyid,r.fkey6)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.fkeyid,r.fkey7)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.fkeyid,r.fkey8)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.fkeyid,r.fkey9)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.fkeyid,r.fkey10)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.fkeyid,r.fkey11)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.fkeyid,r.fkey12)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.fkeyid,r.fkey13)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.fkeyid,r.fkey14)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.fkeyid,r.fkey15)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.fkeyid,r.fkey16)),'')+',',
REPLICATE(',',17-r.keycnt),
'')+') REFERENCES '+QUOTENAME(rtab.name)+' ('+ REPLACE(
ISNULL(QUOTENAME(COL_NAME(r.rkeyid,r.rkey1)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.rkeyid,r.rkey2)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.rkeyid,r.rkey3)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.rkeyid,r.rkey4)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.rkeyid,r.rkey5)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.rkeyid,r.rkey6)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.rkeyid,r.rkey7)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.rkeyid,r.rkey8)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.rkeyid,r.rkey9)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.rkeyid,r.rkey10)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.rkeyid,r.rkey11)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.rkeyid,r.rkey12)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.rkeyid,r.rkey13)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.rkeyid,r.rkey14)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.rkeyid,r.rkey15)),'')+','+
ISNULL(QUOTENAME(COL_NAME(r.rkeyid,r.rkey16)),'')+',',
REPLICATE(',',17-r.keycnt),
'')+')'+
CASE WHEN CASE OBJECTPROPERTY(r.constid,'CnstIsUpdateCascade') WHEN 1 THEN 'CASCADE' ELSE 'NO ACTION' END ='CASCADE' THEN ' ON UPDATE CASCADE' ELSE '' END+
CASE WHEN CASE OBJECTPROPERTY(r.constid,'CnstIsDeleteCascade') WHEN 1 THEN 'CASCADE' ELSE 'NO ACTION' END ='CASCADE' THEN ' ON DELETE CASCADE' ELSE '' END
FROM dbo.sys_sysreferences r WITH (NOLOCK)
INNER JOIN dbo.sys_sysindexes i WITH (NOLOCK) ON r.rkeyid = i.id AND r.rkeyindid = i.indid
INNER JOIN dbo.sys_sysobjects fk WITH (NOLOCK) ON fk.id = r.constid
INNER JOIN dbo.sys_sysobjects ftab WITH (NOLOCK) ON ftab.id = r.fkeyid
INNER JOIN dbo.sys_sysobjects rtab WITH (NOLOCK) ON rtab.id = r.rkeyid;