Массовая копия SQL: триггер не срабатывает - PullRequest
0 голосов
/ 31 мая 2018

Я копирую данные из таблицы Table1 в таблицу Table2, используя sql массовое копирование.Я применил триггер к таблице 2, но мой триггер срабатывает не на каждом ряду.Вот мой триггер и функция sqlbulkcopy.

SqlConnection dstConn = new SqlConnection(ConfigurationManager.ConnectionStrings["Destination"].ConnectionString);
string destination = dstConn.ConnectionString;

//Get data from Source in our case T1 
DataTable dataTable = new Utility().GetTableData("Select * From  [db_sfp_ems].[dbo].[tbl_current_data_new] where [start_date]>'" + calculate_daily_Time + "' and status=0" , source);
SqlBulkCopy bulkCopy = new SqlBulkCopy(source, SqlBulkCopyOptions.FireTriggers)
{
    //Add table name of source
    DestinationTableName = "tbl_current_data",
    BatchSize = 100000,
    BulkCopyTimeout = 360
};
bulkCopy.WriteToServer(dataTable);
//MessageBox.Show("Data Transfer Succesfull.");
dstConn.Close();

------ Триггер -----

ALTER TRIGGER [dbo].[trgAfterInsert] ON [dbo].[tbl_current_data]
   AFTER INSERT 
AS 
BEGIN

    declare @intime datetime
    declare @sdp_id numeric
    declare @value numeric(9,2)


    SELECT @intime= DATEADD(SECOND, -DATEPART(SECOND, start_date), start_date)  FROM INSERTED

    SELECT @sdp_id= sdp_id  FROM INSERTED
    SELECT @value= value  FROM INSERTED

    INSERT INTO Table3(sdp_id,value,start_date)
    VALUES
    (
           @sdp_id,@value,@intime
    )

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Ваш триггер просто сломан.В SQL Server триггеры обрабатывают несколько строк одновременно.Предполагая, что inserted имеет одну строку, это фатальная ошибка - и я хотел бы, чтобы это вызвало синтаксическую ошибку.

Я думаю, что это код, который вы хотите:

ALTER TRIGGER [dbo].[trgAfterInsert] ON [dbo].[tbl_current_data]
   AFTER INSERT 
AS 
BEGIN
    INSERT INTO Table3 (sdp_id, value, start_date)
        SELECT sdp_id, value, 
               DATEADD(SECOND, -DATEPART(SECOND, start_date), start_date)
        FROM inserted i;
END;

Помимо правильностиеще одно преимущество заключается в том, что код проще писать.

Примечание. Часть «секунд» установлена ​​на 0. Однако - в зависимости от типа - у start_date могут сохраняться доли секунды.Если это проблема, задайте другой вопрос.

0 голосов
/ 31 мая 2018

Триггер срабатывает после вставки, независимо от того, касается ли эта вставка 0, 1 или несколько записей, для триггера нет разницы.Таким образом, даже если вы вставляете целую кучу записей, триггер срабатывает только один раз.Это специально, а не BULK_INSERT;это верно для каждого вида вставки.Это также означает, что псевдо-таблица inserted может содержать 0, 1 или несколько записей.Это распространенная ошибка.Обязательно напишите свой триггер таким образом, чтобы он мог обрабатывать несколько записей.Например: SELECT @sdp_id= sdp_id FROM INSERTED не будет работать должным образом, если inserted содержит несколько записей.Переменная будет установлена, но вы не можете знать, какое значение (из какой вставленной записи) она будет хранить.

Это все часть философии SQL, основанной на множествах, лучше не пытаться ее сломать.философия с использованием циклов или других методов RBAR.Оставайтесь в настроении.

...