选择源表和视图表映射编辑错误提示:操作已停止...- 正在初始化数据流任务 (成功)- 正在初始化连接 (成功)- 正在设置 SQL 命令 (成功)- 正在设置源连接 (成功)- 正在设置目标连接 (成功)- 正在验证 (错误)
消息
* 错误 0xc002f210: 准备 SQL 任务: 执行查询“TRUNCATE TABLE [dsc100552_db].[dbo].[ALV_SalesBigClass]
”失败,错误如下:“无法截断表 'dsc100552_db.dbo.ALV_SalesBigClass',因为该表正由 FOREIGN KEY 约束引用。”。失败的原因可能有: 查询本身有问题、未正确设置 "ResultSet" 属性、未正确设置参数或未正确建立连接。
(SQL Server 导入和导出向导)
- 准备执行 (已停止)- 执行之前 (已停止)- 正在执行 (成功)- 正在复制到 [dsc100552_db].[dbo].[ALV_Sales] (已停止)- 正在复制到 [dsc100552_db].[dbo].[ALV_SalesBigClass] (已停止)- 正在复制到 [dsc100552_db].[dbo].[ALV_SalesSmallClass] (已停止)- 执行之后 (已停止)- 清除 (已停止)
消息
* 错误 0xc002f210: 准备 SQL 任务: 执行查询“TRUNCATE TABLE [dsc100552_db].[dbo].[ALV_SalesBigClass]
”失败,错误如下:“无法截断表 'dsc100552_db.dbo.ALV_SalesBigClass',因为该表正由 FOREIGN KEY 约束引用。”。失败的原因可能有: 查询本身有问题、未正确设置 "ResultSet" 属性、未正确设置参数或未正确建立连接。
(SQL Server 导入和导出向导)
- 准备执行 (已停止)- 执行之前 (已停止)- 正在执行 (成功)- 正在复制到 [dsc100552_db].[dbo].[ALV_Sales] (已停止)- 正在复制到 [dsc100552_db].[dbo].[ALV_SalesBigClass] (已停止)- 正在复制到 [dsc100552_db].[dbo].[ALV_SalesSmallClass] (已停止)- 执行之后 (已停止)- 清除 (已停止)
”失败,错误如下:“无法截断表 'dsc100552_db.dbo.ALV_SalesBigClass',因为该表正由 FOREIGN KEY 约束引用。”。失败的原因可能有: 查询本身有问题、未正确设置 "ResultSet" 属性、未正确设置参数或未正确建立连接。
查询本身有问题应该不会,那么就是未正确设置 "ResultSet" 属性、未正确设置参数或未正确建立连接的原因了
而这个第四个主表的数据没有导入,
所以会有错误.
假设你的关系是这样的.
[dsc100552_db].[dbo].[ALV_Sales]这个表是某个表的子表A.而这个A表的数据你没有导入过了.所以会产生ALV_Sales表导致外键约束错误.
根据你的表名称看,ALV_SalesBigClass和ALV_SalesSmallClass应该是SalesClass或者类似的表的子表,
可能是你的SalesClass这个表的数据不完整导致外键约束错误.
主要字段
SalesBigClassID
BigClassNameALV_SalesSmallClass (主键:SalesSmallClassID) 是小类
主要字段
SalesSmallClassID
SalesBigClassID
SmallClassName
外键关系:
ALV_SalesSmallClass.SalesBigClassID = ALV_SalesBigClass.SalesBigClassID
ALV_SalesSmallClass.SalesSmallClassID = ALV_Sales.SalesSmallClassIDALV_Sales (主键:SalesID)是最终的内容
主要字段
SalesID
SalesSmallClassID
SaleaName
经过几个小时的琢磨,直接执行 TRUNCATE TABLE [dsc100552_db].[dbo].[ALV_SalesBigClass] 该语句,都会出现同样的错误提示。查阅资料说是:对于由 FOREIGN KEY 约束引用的表(即主键所在的表,不是外键所在的表)不能使用 TRUNCATE TABLE。请问哪么大侠知道在哪里设置: "ResultSet" 属性、未正确设置参数 ? (我琢磨也是这个原因,大家在平时设计数据库时就没有碰到过这种外键约束引用的错误吗? 我在SQL 2000上是没有碰到过,在SQL 2005上还是第一次)
首先假设有这样的主外表关系:use test
gocreate table dbo.Test_Primary
(
id int identity(1,1)
,name varchar(10)
,constraint pk_Test_Primary primary key
(
id ASC
)
)create table dbo.Test_FOREIGN
(
id int identity(1,1)
,For_ID INT
,CONSTRAINT for_Test_FOREIGN_Test_Primary_For_ID FOREIGN KEY (For_ID)REFERENCES Test_Primary (ID)
,name varchar(10)
,constraint PK_Test_FOREIGN primary key
(
id ASC
)
)--1.建立一个Bak表来临时存放要导入的数据(表结构要和导入的表一致,除了Index,Constraint,但必须建立主键)
create table dbo.Test_FOREIGN_Bak
(
id int identity(1,1)
,For_ID INT
,name varchar(10)
,constraint PK_Test_FOREIGN primary key
(
id ASC
)
)--2.将要导入的数据,先导入Bak表(dbo.Test_FOREIGN_Bak,因为这个是空表,肯定会成功)
--可以用DTS(2000的比较快,说实话,我不喜欢用SQL 2K5的DTS)、SSIS包(这个比较麻烦)或者是BCP(比较适合大容量数据导入导出)--3.将Bak表作为数据来源向正式表导入数据(这个地方是最关键的,不是一股脑儿的导就行了,要进行筛选的)
/*
这个地方要特别注意,要是在表dbo.Test_FOREIGN建有Replication的话,建议不要一次性Insert 10万级别的数据,
特别是表数据字段比较宽的时候,这样会带给Distribution库很大的压力,很可能导致网络拥塞或Server反应缓慢。
可以考虑循环Insert,每次循环最好能够Delay 5~10秒
*/
set identity_insert dbo.Test_FOREIGN on
insert into dbo.Test_FOREIGN
(
id
,For_ID
,name
)
select id
,For_ID
,name
from dbo.Test_FOREIGN_Bak as a with (nolock)
where not exists(select top 1 1--排出主键冲突
from dbo.Test_FOREIGN as b with (nolock)
where a.id=b.id)
and For_ID IN (select id--如果For_ID不在主表中,就会报告问题中的错误
from dbo.Test_Primary with (Nolock)
)
set identity_insert dbo.Test_FOREIGN off
--4.删除Bak表
truncate table dbo.Test_FOREIGN_Bak
drop table dbo.Test_FOREIGN_Bak
道理很简单,你自己想下就明白了啊有二表a,b
ta:
aid name
1 aa
2 bbtb
id aid
1 1
2 1
3 2tb的aid引用的ta的aid
那么对ta进行delete时,因为aid被tb引用的嘛,1,2这两个aid值被tb引用,当然不能删除了。
如果先delete tb,那么没有什么东西去引用ta的的aid时,当然可以删除了。你导入也是一个道理。
如果先导入tb, 会进行约束检查,查找aid被引用的源,由于ta没有被导入,找不到,当然约束检查通不过。