忽略存储过程/阻止过程中的警告停止

时间:2016-11-17 16:05:08

标签: sql-server tsql bulkinsert

我管理的数据库是来自40个不同的单独服务器的集合体,这些服务器具有相同的结构但是它们自己的唯一数我的中央系统上有多个存储过程,它们从这些服务器编译的BULK INSERT文件中执行.txt个表。

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

  

Msg 547,Level 16,State 0,Line 36   INSERT语句与FOREIGN KEY约束“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

1 个答案:

答案 0 :(得分:0)

您可以临时禁用检查外键,导入后可以轻松清理数据。

exec sp_msforeachtable "alter table ? nocheck constraint all"

如果是实时服务器副本数据库结构,请在成功清理后将数据导入临时数据库,将此数据填入实时。