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
有没有办法忽略外键约束,但仍捕捉其他错误?
这是一个坏主意,也是一个糟糕设计的明显标志。任何情况下都不会删除PK记录并保留FK记录。用用户登录来做这件事完全是不负责任的。将数据插入临时表,然后只更新/删除/插入适当的记录到具有PK的表(尽管有登录,我将失活而不是删除,但仍需要关联的过去记录)。 – HLGEM
如果您在插入的文件中存在数据完整性问题,则需要将其插入到字段为varchar(max)或nvarchar(max)的登台表中,然后在转至生产表之前清理不良数据。将数据直接插入批量插入生产表中对您的数据完整性有风险。当你这样做的时候,只有坏事发生。 – HLGEM
'并且丢失桌面上的所有东西'你在上一个问题中得到了解决方案,但是你接受了一个不好的答案。 – usr