Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Изменение данных перед вставкой  [new]
JcJet
Member

Откуда:
Сообщений: 11
Всем доброго времени суток. Столкнулся тут с одним "затыком" в разработке, может кто-нибудь подскажет...

В таблицу приходят данные посредством INSERT. Но данные нужно обработать перед вставкой, и сделать это в СУБД.
То есть, имеется триггер:
CREATE TRIGGER ODBCDealsInsert ON RAW_Deals
INSTEAD OF INSERT 
AS
BEGIN
INSERT INTO Deals 
SELECT * FROM inserted --
END
GO

Никак не соображу, что нужно написать, чтобы эти данные менялись "на лету" и шли дальше :(
Нужно из двух столбцов сделать один (в одном дата, в другом время - сделать дату со временем), и один из столбцов переделать в логический(bit), в зависимости от содержимого(условия)...
30 мар 16, 23:58    [18998216]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных перед вставкой  [new]
iljy
Member

Откуда:
Сообщений: 8711
JcJet,

в SELECT вместо * напишите в явном виде, что вы хотите вставить.
31 мар 16, 00:12    [18998226]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных перед вставкой  [new]
JcJet
Member

Откуда:
Сообщений: 11
iljy,

Я понимаю, что нужно там, но пока понимаю только как извлекать конкретные данные через SELECT, а вот как их изменить, не совсем.

...Как всё просто было с циклами и индексами в массивах и списках :)
31 мар 16, 00:17    [18998227]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных перед вставкой  [new]
iljy
Member

Откуда:
Сообщений: 8711
JcJet,

в селекте можно писать достаточно произвольные выражения.

select a, b, d1+t1, case when x>y then 1 else 0 end
from inserted


тогда каждая строка выдачи будет вычисляться на основе элемента множества inserted.

С множествами все тоже очень просто, если не пытаться думать в терминах индексов, списков, циклов и т.п.
31 мар 16, 00:27    [18998231]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных перед вставкой  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
JcJet,

полагаете, в RAW_Deals записи появятся сами?
Где вставка-то?
31 мар 16, 09:50    [18998852]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных перед вставкой  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
JcJet
iljy,

Я понимаю, что нужно там, но пока понимаю только как извлекать конкретные данные через SELECT, а вот как их изменить, не совсем.

...Как всё просто было с циклами и индексами в массивах и списках :)


Разобраться несложно после наступления понимания, что язык запросов предназначен для управления математическими множествами, а не единичными величинами.
31 мар 16, 12:22    [18999634]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных перед вставкой  [new]
JcJet
Member

Откуда:
Сообщений: 11
iap,

Решил не загружать сообщение не релевантным кодом, вставка работает в таблицу, в которой есть все нужные столбцы, но в такой таблице будут лишние столбцы, и при отображении данных все равно придётся делать те же операции, в базе или в приложении.

Если интересно, это импорт таблиц из терминала QUIK по ODBC.
1 апр 16, 07:35    [19003106]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных перед вставкой  [new]
JcJet
Member

Откуда:
Сообщений: 11
Владислав Колосов,

Да вот, пытаюсь получить понимание, покачто ломается мозг о новую логику :) За спиной около 5 лет работы на разных ООП, и всё равно...
Читал книгу, но, как всегда, после простого чтения запоминается мало. Или может я уже неочень :)
1 апр 16, 07:40    [19003119]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных перед вставкой  [new]
Glory
Member

Откуда:
Сообщений: 104751
JcJet
и при отображении данных все равно придётся делать те же операции, в базе или в приложении.

"Отображение данных" - это select
Т.е. это та главная команда, которую вам надо написать для решения вашей задачи с триггером. И все.
1 апр 16, 08:19    [19003166]     Ответить | Цитировать Сообщить модератору
 Re: Изменение данных перед вставкой  [new]
JcJet
Member

Откуда:
Сообщений: 11
Разобрался, заработало :)
INSTEAD OF INSERT 
AS
BEGIN
INSERT INTO Deals 
SELECT Ticker, Date+Time, Price, Volume, case when Operation = 'Покупка' OR Operation = 'B' then 1 else 0 end, ID FROM inserted
WHERE NOT EXISTS (SELECT Ticker FROM Deals WHERE Deals.ID = inserted.ID)
END
2 апр 16, 10:54    [19008209]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить