2015-11-05 65 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所述)是將數據加載到「暫存」表中,然後複製/合併/否則將其移入「實時」表中,並進行徹底和嚴格的數據完整性檢查和控制。