2016-11-17 120 views
0

我管理一个数据库,它是来自40个具有相同结构但具有唯一数据的不同服务器的集合。我在中央系统上有多个存储过程,它们从这些服务器编译的.txt文件中为它们的表执行BULK INSERT忽略存储过程中的警告/阻止过程停止

由于40个不同的场外服务器,有时会因包丢失而丢失一些数据。我的问题是,是否有我的程序忽略警告并继续处理?在这种特殊情况下,我想跳过错误,如:

消息547,级别16,状态0,36号线 INSERT语句冲突与外键约束“FK_AppointmentPatient”。数据库“Eaglesoft”中发生冲突,表“Patient.Patient”。

我意识到它抛出这个错误,因为它正在寻找的主键不在外键关系的相应表中。但是,我想在自动化过程中更新尽可能多的数据,然后检查日志,然后修复这些问题。除了我所有的工作。这里正在使用的存储过程:

CREATE TABLE Patient.TempAppointment --Create Temporary table for data 
(
    ClinicID INT NULL, 
    AppointmentID INT NULL, 
    StartTime DATETIME NULL, 
    EndTime DATETIME NULL, 
    PatientID INT NULL, 
    LocationID TINYINT NULL, 
    TypeID INT 
) 


BULK INSERT Patient.TempAppointment --Insert data into temporary table 
FROM 'E:\Data\PatientAppointment.txt' 
WITH (
FIELDTERMINATOR='|', 
ROWTERMINATOR='\n', 
MAXERRORS = 99 
) 


INSERT INTO Patient.Appointment --Insert data into main table from temporary table where the data doesn't already exist 
SELECT * 
FROM Patient.TempAppointment 
WHERE NOT EXISTS 
(SELECT * 
FROM Patient.Appointment 
WHERE (Patient.TempAppointment.AppointmentID=Patient.Appointment.AppointmentID AND Patient.TempAppointment.ClinicID=Patient.Appointment.ClinicID)) 
AND Patient.TempAppointment.AppointmentID IS NOT NULL 
AND Patient.TempAppointment.PatientID IS NOT NULL 


DROP TABLE Patient.TempAppointment --Drop Temporary Table 
+4

这不是一个警告。执行参照完整性是一个严重错误。我建议,当像这样进行导入时,首先将数据导入登台表。这样你就可以操纵和按摩你所需要的数据。 –

+0

你想避免这个错误,或者它对参照完整性没有影响吗? – McNets

+0

你可以临时禁用foreigen键constaints,http://stackoverflow.com/questions/159038/how-can-foreign-key-constraints-be-temporarily-disabled-using-t-sql – McNets

回答

0

你可以暂时禁用检查外键并导入容易清理数据之后。

exec sp_msforeachtable "alter table ? nocheck constraint all" 

如果它是活的服务器拷贝数据库结构,导入数据到succesfull洁面后临时数据库填补这一数据变成活的。