#sql #sql-server #tsql
#sql #sql-сервер #tsql
Вопрос:
Вот таблица
CREATE TABLE Users
(
Id INT PRIMARY KEY IDENTITY(0,1),
Name NVARCHAR(20) NOT NULL,
Surname NVARCHAR(25) NOT NULL,
Email NVARCHAR(30),
Facebook NVARCHAR(30),
CHECK(Email IS NOT NULL OR Facebook IS NOT NULL)
);
Это данные, которые я должен вставить в Users
таблицу.
1, N'Alex', Mituchin, qwe@gmail.com, NULL
Это BULK INSERT
BULK INSERT Users
FROM 'C:UsersSAMIRDownloadsTelegram Desktopusers.txt'
WITH (
FIELDTERMINATOR = 't',
ROWTERMINATOR = 'n',
--FIRSTROW = 0,
--UTF-8
CODEPAGE = '65001',
DATAFILETYPE = 'widechar'
);
И, наконец, это триггер, который должен фильтровать данные при вставке данных в Users
таблицу
CREATE TRIGGER InsertedUsersTB
ON Users
AFTER INSERT
AS
UPDATE Users
SET NAME = (CASE
WHEN NAME LIKE 'N''%'''
THEN SUBSTRING(Name, 3, LEN(Name) - 3)
ELSE NAME
END)
FROM Users
Проблема в том, что при массовой вставке в мою Users
таблицу триггер не может это перехватить. Как я могу заставить этот триггер начать работу?
Комментарии:
1. Основываясь на ваших 2 сообщениях за день, я могу сказать вам прямо сейчас, что вы создаете для себя огромный беспорядок. Сделайте шаг назад и начните этот процесс с самого начала, теперь, когда вы понимаете подводные камни. Не используйте триггеры для очистки данных.
2. @JacobH что я должен использовать вместо триггера?
3. Не могли бы вы, возможно, загрузить данные в таблицу «промежуточный пост», а затем выполнить очистку там (после завершения массовой вставки) перед заполнением вашей рабочей таблицы? Полностью согласен с @JacobH, что вы чрезмерно усложняете это.
4. Также: очень странно, что ваш
AFTER INSERT
триггер вообще не обращается кInserted
псевдотаблице. Это псевдотаблица, доступная только внутри триггера, которая содержит все строки, которые были вставлены последним оператором — обычно эту псевдотаблицу используют для определения, с какими строками что-то делать, а не только со всей таблицей!
Ответ №1:
Если вы прочитаете документацию для МАССОВОЙ ВСТАВКИ, вы можете узнать, что по умолчанию триггеры не запускаются. Вам нужно добавить опцию в свой оператор. Опция просто FIRE_TRIGGERS
Комментарии:
1. @SamirHemzeyev Я думаю, что это, возможно, ответило на вопрос, но я не уверен, что это действительно решило проблему.
2. Я должен согласиться с Шоном. Это было бы намного эффективнее с решением, которое я предложил по другому вопросу, опубликованному Samir.