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