2015-11-05 61 views
0

我正在使用此代码截断并将新值插入到表中。其他一些表具有引用此外键的外键,所以我需要在截断它之前禁用检查外键约束。禁用外键约束而不禁用其他错误?

我的问题是,我的代码不仅禁用外键约束,但也忽略了其他的错误的孩子。例如,试图在日期字段中插入字符串将打印“确定”并提交事务。

BEGIN TRANSACTION 
EXEC sp_MSforeachtable @command1='ALTER TABLE ? NOCHECK CONSTRAINT ALL' 
DELETE FROM Users_Login 
BULK INSERT Users_Login FROM '\\STRMV3302\Temp\lisandro.h.vaccaro - Users_Login.txt' WITH (FIELDTERMINATOR = '||', ROWTERMINATOR = '\n', FIRSTROW = 2, CODEPAGE = 'ACP') 
EXEC sp_MSforeachtable @command1='ALTER TABLE ? ENABLE TRIGGER ALL' 
IF @@ERROR = 0 
BEGIN 
COMMIT 
PRINT 'OK' 
END 
ELSE 
BEGIN 
ROLLBACK 
PRINT 'ERROR' 
END 

当我尝试插入一个表上的日期时间字段我得到这个输出“#”,并在桌子上失去了一切:

(2 row(s) affected) 
Msg 4864, Level 16, State 1, Line 10 
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 3, column 4 (LogoutDate). 
OK 

有没有办法忽略外键约束,但仍捕捉其他错误?

+1

这是一个坏主意,也是一个糟糕设计的明显标志。任何情况下都不会删除PK记录并保留FK记录。用用户登录来做这件事完全是不负责任的。将数据插入临时表,然后只更新/删除/插入适当的记录到具有PK的表(尽管有登录,我将失活而不是删除,但仍需要关联的过去记录)。 – HLGEM

+0

如果您在插入的文件中存在数据完整性问题,则需要将其插入到字段为varchar(max)或nvarchar(max)的登台表中,然后在转至生产表之前清理不良数据。将数据直接插入批量插入生产表中对您的数据完整性有风险。当你这样做的时候,只有坏事发生。 – HLGEM

+0

'并且丢失桌面上的所有东西'你在上一个问题中得到了解决方案,但是你接受了一个不好的答案。 – usr

回答

0

这看起来不像外键约束错误,它看起来像一个BULK INSERT错误,您尝试将值加载到列中,但SQL无法使您的值与列的数据类型一致。具体来说,如果我正确地阅读了您的信息,则看起来您正试图将值#加载到日期时间列中。

除此之外,我同意@ HLGEM - 虽然,缺乏你的应用程序和流程的智慧,我保留判断为什么你正在做你在做什么。即便如此,你为什么要禁用外键?你打算以后重新启用它们吗?如果有很多表格引用这个表格,那可能会非常困难和麻烦。通常的策略(如@HLGEM所述)是将数据加载到“暂存”表中,然后复制/合并/否则将其移入“实时”表中,并进行彻底和严格的数据完整性检查和控制。