我正在使用此代码截断并将新值插入表中。其他一些表具有引用此键的外键,因此我需要在截断它之前禁用检查外键约束。
我的问题是我的代码不仅禁用了外键约束,还忽略了其他错误。例如,尝试将字符串插入日期字段时会打印“确定”并提交事务。
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
当我尝试在DateTime字段上插入带有'#'的表时,我得到了这个输出,并丢失了表中的所有内容:
(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
有没有办法忽略外键约束,同时还能捕获其他错误?
答案 0 :(得分:0)
这看起来不像是外键约束错误,它看起来像BULK INSERT
错误,您尝试将值加载到列中但SQL无法将您的值与列的数据类型进行协调。具体来说,如果我正确地阅读您的信息,您似乎正在尝试将值#
加载到日期时间列中。
除此之外,我同意@ HLGEM - 但是,你的应用程序和流程缺乏知识,我正在为为什么你正在做你正在做的事情做出判断。即便如此,为什么要禁用外键?你打算以后重新启用它们吗?如果很多表引用了这个表,那可能会非常困难和混乱。通常的Tactic(如@HLGEM所说)是将数据加载到“临时”表中,然后复制/合并/以其他方式将其移动到“实时”表中,并进行彻底和严格的数据完整性检查和控制。